Matplotlib 图在 y 轴上显示 2 个标签

Matplotlib plot shows 2 labels on the y-axis

我正在尝试在 matplotlib 中生成连续生成的绘图。我面临的问题与右侧 y 轴上的标签有关。显示的范围是我想要的,但是还有一个额外的偏移标签 (0, 0.2, ... 1,0)。

def doAnimation():
    fig, ax = plt.subplots()

    def animate(i):
        data=prices(a,b,c)  #this gives a DataFrame with 2 columns (value 1 and 2)

        plt.cla()
        ax.plot(data.index, data.value1)
        ax2 = ax.twinx()
        ax2.plot(data.index, data.value2)
        plt.gcf().autofmt_xdate()     
        plt.tight_layout()  
        return ax, ax2

    call = FuncAnimation(plt.gcf(), animate, 1000)  
    return call

callSave = doAnimation()
plt.show()

有什么办法可以去掉集合:0.0、0.2、0.4、0.6、0.8、1.0?

图表是这样的:

plt.cla 清除当前轴。第一次调用 plt.cla 时,当前轴为 axax2 尚不存在)。清除这些轴会将 ax 的 x 和 y 范围重置为 (0,1)。但是,在第 8 行,您绘制到 ax,并且两个范围都进行了适当调整。

在第 9 行,您创建了一组 轴并将它们命名为 ax2。当您离开 animate 函数时,名称 ax2 将超出范围,但它所引用的坐标区对象将保留。这些轴现在是当前轴。

第二次调用 animate 时,plt.cla 清除这些轴,将 x 和 y 范围重置为 (0,1)。然后,在第 9 行,您创建了一组 new 轴并将它们命名为 ax2这些轴和之前的不是同一个轴! ax2其实是指第三组轴,下次调用plt.cla时会清空。每次对 animate 的新调用都会生成一组新的轴。有问题的轴标签显示为粗体;事实上,它们已被绘制一千次。

最简单(最少的更改)修复是将 ax2 = ax.twinx() 移到 animate 之外,并用单独调用 ax.cla 和 [=28= 替换 plt.cla ].

我认为更好的方法是在 animate 之外创建行,并在 animate 内修改它们的数据。当我们这样做的时候,让我们用对 fig 的引用替换对 plt.gcf() 的引用,并通过 将参数设置为 tight_layout [=34] =].

将上述变化放在一起,我们得到,

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import pandas as pd
import numpy as np


def dummy_prices():
    samples = 101
    xs = np.linspace(0, 10, samples)
    ys = np.random.randn(samples)
    zs = np.random.randn(samples) * 10 + 50
    return pd.DataFrame.from_records({'value1': ys, 'value2': zs}, index=xs)


def doAnimation():
    fig, ax = plt.subplots(1, 1, tight_layout=True)
    fig.autofmt_xdate()
    ax2 = ax.twinx()

    data = dummy_prices()
    line = ax.plot(data.index, data.value1)[0]
    line2 = ax2.plot(data.index, data.value2, 'r')[0]

    def animate(i):
        data = dummy_prices()
        line.set_data(data.index, data.value1)
        line2.set_data(data.index, data.value2)
        return line, line2

    animator = FuncAnimation(fig, animate, frames=10)
    return animator


def main():
    animator = doAnimation()
    animator.save('animation.gif')


if __name__ == '__main__':
    main()

其中 animation.gif 应该类似于,