matplotlib 中的偏移辅助轴

klu*_*onk 3 python plot matplotlib

我正在尝试将 matplotlib 中的不同绘图设置结合在一起。我在 matplotlib 示例库/文档和堆栈中找到了每个示例的很好的示例,但我找不到有关我的具体问题的任何内容。

\n\n

所以到目前为止我所知道的是,如何添加一个或多个具有偏移 y 轴的轴,以便通过使用ax.twinx(). 在示例寄生轴演示中,第三个 y 轴称为寄生轴。但是,如果您想添加一个附加轴(该轴只是现有轴的缩放版本),则可以使用,如辅助轴演示中所示。没有其他数据可供绘制。ax.secondary_yaxis()

\n\n

到目前为止,我无法实现的是与原始 y 轴偏移的辅助 y 轴。这对于使图表在科学界更具可读性非常有帮助。例如,虽然一些科学家使用频率作为电磁频谱的参考,但其他科学家则使用波长或波数。Afsar [1] 使用了一种非常方便的轴标签,其中在同一图中包含所有三个变量:

\n\n

毫米波中电介质的吸收

\n\n

我想要类似的东西,只是在 y 轴而不是 x 轴上。有没有办法使次轴与主轴偏移?我尝试了一些参数但无法弄清楚。

\n\n

感谢您的任何帮助!

\n\n

[1] 穆罕默德·努鲁尔·阿夫萨。\xe2\x80\x9c常见聚合物的复折射率、复介电常数和损耗角正切的精密毫米波测量。\xe2\x80\x9d IEEE 仪器和测量汇刊 IM\xe2\x80\x9336,编号。2(1987 年 6 月):530\xe2\x80\x9336。https://doi.org/10.1109/TIM.1987.6312733

\n\n

[1]:

\n

Jod*_*mak 5

一个完整的例子。倒数第三行是相关的。

import matplotlib.pyplot as plt
import numpy as np
import datetime

dates = [datetime.datetime(2018, 1, 1) + datetime.timedelta(hours=k * 6)
         for k in range(240)]
temperature = np.random.randn(len(dates)) * 4 + 6.7
fig, ax = plt.subplots(constrained_layout=True)

ax.plot(dates, temperature)
ax.set_ylabel(r'$T\ [^oC]$')
plt.xticks(rotation=70)


def date2yday(x):
    """Convert matplotlib datenum to days since 2018-01-01."""
    y = x - mdates.date2num(datetime.datetime(2018, 1, 1))
    return y


def yday2date(x):
    """Return a matplotlib datenum for *x* days after 2018-01-01."""
    y = x + mdates.date2num(datetime.datetime(2018, 1, 1))
    return y


secax_x = ax.secondary_xaxis('top', functions=(date2yday, yday2date))
secax_x.set_xlabel('yday [2018]')


def celsius_to_fahrenheit(x):
    return x * 1.8 + 32


def fahrenheit_to_celsius(x):
    return (x - 32) / 1.8


secax_y = ax.secondary_yaxis(
    'right', functions=(celsius_to_fahrenheit, fahrenheit_to_celsius))
secax_y.set_ylabel(r'$T\ [^oF]$')


def celsius_to_anomaly(x):
    return (x - np.mean(temperature))


def anomaly_to_celsius(x):
    return (x + np.mean(temperature))


# document use of a float for the position:
secax_y2 = ax.secondary_yaxis(
    1.2, functions=(celsius_to_anomaly, anomaly_to_celsius))
secax_y2.set_ylabel(r'$T - \overline{T}\ [^oC]$')


plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述