matplotlib:使用交互模式绘制跨越多个子图的水平线

时间:2017-10-02 19:15:29

标签: python matplotlib

我在matplotlib中使用交互模式来计算一些参数。我想水平绘制两个子图,然后绘制一条穿过它们的水平线。我重现了我的问题,如下面的代码

import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
plt.ion()
f,axarr=plt.subplots(1,2,sharey=True,gridspec_kw={'width_ratios':[100,1]})
axarr[0].set_title('subplot_1')
axarr[1].set_title('subplot_2')
axarr[0].get_xaxis().set_visible(False)
axarr[1].get_xaxis().set_visible(False)
for i in range(100):
    data_1 =np.random.randint(100,size=1)
    data_2=np.random.randint(100,size=1)
    axarr[0].bar(i,data_1,width=1)
    axarr[1].bar(1,data_2,width=1)
    axarr[0].axhline(y=data_2+5,xmin=0,xmax=i,c='yellow',linewidth=10,zorder=0,clip_on=False,animated=True)
    axarr[1].axhline(y=N_level+20,c='yellow',xmin=0,xmax=1,linewidth=10,zorder=0,clip_on=False,animated=True)
    plt.pause(0.000000000001)

但是这段代码并没有生成这条水平线。我需要有一个类似于这个数字的情节 enter image description here

1 个答案:

答案 0 :(得分:0)

您需要删除animated=True。这将显示该行。

现在问题是你为每个迭代步骤添加一个新行,这样最后,完整的绘图将是黄色的。为避免这种情况,我建议在循环外定义行,并仅为每一步更新其位置。

import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
plt.ion()
f,axarr=plt.subplots(1,2,sharey=True,gridspec_kw={'width_ratios':[50,1]})
axarr[0].set_title('subplot_1')
axarr[1].set_title('subplot_2')
axarr[0].get_xaxis().set_visible(False)
axarr[1].get_xaxis().set_visible(False)

line = axarr[0].axhline(y=0,xmin=0,xmax=1,c='yellow',linewidth=2,zorder=5,clip_on=False)

for i in range(100):
    data_1 =np.random.randint(100,size=1)
    data_2=np.random.randint(100,size=1)
    axarr[0].bar(i,data_1,width=1)
    axarr[1].bar(1,data_2,width=1)
    line.set_ydata([data_1,data_1])
    plt.pause(0.000000000001)
plt.ioff()
plt.show()

请注意,我遗漏了第二行,因为代码中的变量未定义,我不知道应该显示什么。