Matplotlib MultiCursor 未在多个子图上显示

问题描述 投票:0回答:3

我有一个 Matplotlib 图,其中有 6 个相邻的垂直图,所有图均带有 sharey=True。当我在任何一个图上移动光标时,我希望在其他 5 个图上显示水平光标/标记。我知道 MultiCursor 是最好的方法。我已经看过这个,当我运行它时它工作正常,所有这些都在水平图上。我的代码没有在任何 GUI 中运行(如果有影响的话),但这个演示也没有。 Matplotlib 画廊演示

当我用我的情节尝试时,什么也没有发生。下面的图代码仅链接两个子图而不是全部 6 个子图,但无论如何它都不起作用。我在代码主体中导入了MultiCursor。

def Raw_Plot():  #Raw Data Plot

global unitW
fig, axs=plt.subplots(1,6,constrained_layout=True, sharey=True)
fig.suptitle(tail)
axs[0].plot(df['Cone'],df['Depth'],'r-',linewidth=0.8)
axs[0].set_xlabel('$q_c$ (MPa)')
axs[0].set_ylabel('Depth (m)')
axs[0].set_title('Cone resistance',fontsize=10)
axs[0].grid()
axs[0].set_ylim(dmax,0)
axs[0].set_xlim(0,None)
axs[1].plot(df['Friction'],df['Depth'],'b-',linewidth=0.8)
axs[1].set_xlabel('$f_s$ (MPa)')
axs[1].set_title('Sleeve Friction',fontsize=10)    
axs[1].grid()
axs[1].set_xlim(0,None)
axs[1].set_ylabel('Depth (m)')
axs[2].plot(df['Pore'],df['Depth'],'g-',linewidth=0.8)
axs[2].plot(df['AmbientM'],df['Depth'],'r-',linewidth=0.8)
axs[2].plot(df['Bq'],df['Depth'],'g--',linewidth=0.8)
axs[2].set_xlabel('$U_2$, $U_0$ (MPa) & $B_q$')
axs[2].set_title('Raw, Ambient and \n Normalised Pore Pressures',fontsize=10)    
axs[2].grid()
axs[2].set_ylabel('Depth (m)')
axs[3].plot(df['Rf'],df['Depth'],'c-',linewidth=0.8,label='$R_f$')
axs[3].plot(df['Fr'],df['Depth'],'b-',linewidth=0.8, label='$F_r$')
axs[3].set_xlabel('$F_r$ & $R_f$ (%)')
axs[3].set_xlim(0,10)
axs[3].set_title('Friction Ratios',fontsize=10)
axs[3].set_ylabel('Depth (m)',fontsize=10)
axs[3].legend(loc='upper right',bbox_to_anchor=(1,1),fontsize=6.5)
axs[3].grid()
axs[4].plot(df['Qtn'],df['Depth'],'r-',linewidth=0.8)
axs[4].set_xlabel('$Q_{tn}$')
axs[4].set_ylabel('Depth (m)')
axs[4].set_title('Normalised Cone resistance',fontsize=10)
axs[4].grid()
axs[4].set_ylim(dmax,0)
axs[4].set_xlim(0,None)
axs[5].plot(df['GammaS'],df['Depth'],'c-',linewidth=0.8, label='Calculated')
axs[5].plot(df['GaDef'],df['Depth'],'b-',linewidth=1.0, label='Default '+str(unitW))
axs[5].legend(loc='upper right',bbox_to_anchor=(1,1),fontsize=6.5)
axs[5].set_xlabel('$\gamma$ $(kN/m^3)$')
axs[5].set_xlim(14,20)
axs[5].xaxis.set_major_formatter(FormatStrFormatter('%.1f'))    
axs[5].set_title('Soil Unit Weight',fontsize=10)
axs[5].set_ylabel('Depth (m)')
axs[5].grid()

fig.canvas.set_window_title(tail)
multi=MultiCursor(fig.canvas,(axs[1],axs[4]),color='r',lw=1)
plt.ion() #makes plot non-blocking - Can open multiple plots
plt.show()
python-3.x macos matplotlib matplotlib-widget
3个回答
0
投票

我已经解决了问题的最初部分。 plt.ion() 和 MultiCursor 似乎是互斥的;如果关闭 plt.ion() 那么 MultiCursor 就可以工作。缺点是我不能同时打开多个 Matplotlib 窗口。 我在这里将其作为一个单独的问题打开:

plt.ion() 阻止 MultiCursor


0
投票

至少当使用 Spyder 作为我的编辑器时,不需要

plt.ion()
就可以绘制多个图。

multi = MultiCursor(fig....
仍未被执行(“局部变量 multi 已分配但从未使用”)并且多个子图上没有光标。

我已经使用

plt.multi = MultiCursor(fig...
解决了这个问题。 这仍然一次只适用于一个图,但至少我有 MultiCursor,它是最后一个打开的图。


0
投票

发生这种情况是因为许多 matplotlib 对象会被垃圾收集,除非您保留对它们的引用(文档提到了这一点)。

这只会导致最后一个被保存:

for fig in figs:
    multi = MultiCursor(fig.canvas, fig.get_axes(), color='r', lw=1)

保留对所有内容的引用将使对象保留在周围:

junk = []
for fig in figs:
    multi = MultiCursor(fig.canvas, fig.get_axes(), color='r', lw=1)
    junk.append(multi)
© www.soinside.com 2019 - 2024. All rights reserved.