【问题标题】:Python: plot multiple y axes in one plotPython:在一个图中绘制多个 y 轴
【发布时间】:2018-10-25 00:19:48
【问题描述】:

我试图在一个图中绘制三个具有不同 y 轴的图。到目前为止它有效。它的代码如下:

import matplotlib.pyplot as plt


plt.close('all')
def make_patch_spines_invisible(ax):
        ax.set_frame_on(True)
         ax.patch.set_visible(False)
         for sp in ax.spines.values():
             sp.set_visible(False)
plt.rcParams["figure.figsize"] = [16, 9]
fig, host = plt.subplots()
fig.subplots_adjust(right=0.75)

par1 = host.twinx()
par2 = host.twinx()
par2.spines["right"].set_position(("axes", 1.2))
make_patch_spines_invisible(par2)
par2.spines["right"].set_visible(True)

p1, = host.plot(x1,y1, "g-", label = "y1", lw=0.5, alpha = 0.7)
p2, = par1.plot(x2,y2, "r-", label = "y2", lw= 0.5)
p3, = par2.plot(x3,y3, "b-", label = "y3", lw= 0.5)

host.set_xlabel("Time [s]")
host.set_ylabel("y1")
par1.set_ylabel("y2")
par2.set_ylabel("y3")

host.yaxis.label.set_color(p1.get_color())
par1.yaxis.label.set_color(p2.get_color())
par2.yaxis.label.set_color(p3.get_color())

tkw = dict(size=4, width=1.5)
host.tick_params(axis='y', colors=p1.get_color(), **tkw)
par1.tick_params(axis='y', colors=p2.get_color(), **tkw)
par2.tick_params(axis='y', colors=p3.get_color(), **tkw)
host.tick_params(axis='x', **tkw)

lines = [p1, p2, p3]

host.legend(lines, [l.get_label() for l in lines])
plt.title('Messung 1')
plt.xticks(np.arange(min(x1), max(x1)+100,25))
host.grid(axis = 'x' ,linestyle = '-', linewidth='0.5')

plt.show()   

The plot looks like this

到目前为止一切正常。但是有一个错误。蓝色图表 (y3) 是错误的。该信号是在与其他两个信号相同的时间段内测量的,但根据该图,信号在 290 秒处结束。 我发现,最后绘制的信号总是错误的。

谁能帮帮我? 非常感谢。

【问题讨论】:

  • 我相信 pyplot 没有时域,每个样本都被视为时间 t 意思是除非您的输入长度相同并且与您期望的对齐,否则图形将不正确,pyplot 可能会尝试规模化。
  • 这一切都取决于x1x2x3。本问题的读者不知道这些。因此,这里几乎没有人可以提供帮助。
  • x1, x2, x3 的值介于 0 到 360 秒之间。只有步长不同。 x1 的步长非常小。 x2 和 x3 步长相同且步长大于 x1 的步长。
  • 我建议提供minimal reproducible example,并在代码中定义模型数据。

标签: python matplotlib plot yaxis


【解决方案1】:

这是因为 plt.xticks() 没有更新所有双轴...

替换 plt.xticks(np.arange(min(x1), max(x1)+100,25))

host.xaxis.set_major_locator(plt.FixedLocator(np.arange(min(x1), max(x1)+100,25)))

你很高兴;-)

或者使用:

host.set_xticks(np.arange(min(x1), max(x1)+100,25))
par1.set_xticks(np.arange(min(x1), max(x1)+100,25))
par2.set_xticks(np.arange(min(x1), max(x1)+100,25))

顺便说一句...只需添加以下几行即可提供验证示例:

import numpy as np
x1 = np.linspace(1,100,100)
x2 = np.linspace(1,100,50)
x3 = np.linspace(1,100,50)

y1 = x1 
y2 = x2 **3
y3 = x3 **2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多