gpt4 book ai didi

python - subplot2grid 内有 2 个图

转载 作者:太空宇宙 更新时间:2023-11-03 16:37:07 26 4
gpt4 key购买 nike

我正在使用 suplot2grid 绘制 6 个子图,每个子图内部都有 2 个时间序列。每个子图都应在不同的 Y(垂直)轴上显示值。
我当前的输出接近我的目标,但仍然错误,如下所示: enter image description here

现在我所做的事情如下:

fig2    = plt.figure(figsize=(14,11))

# defining the axes

ax1_a = plt.subplot2grid((12,2),(0,0), rowspan=3, colspan=1) # drift
ax1_b = plt.subplot2grid((12,2),(4,0), rowspan=3, colspan=1, sharex=ax1_a) # zscore drift
ax1_b = ax1_a.twinx()

ax2_a = plt.subplot2grid((12,2),(4,0), rowspan=3, colspan=1, sharex=ax1_a)
ax2_b = plt.subplot2grid((12,2),(8,0), rowspan=3, colspan=1, sharex=ax1_a)
ax2_b = ax2_a.twinx()

ax3_a = plt.subplot2grid((12,2),(8,0), rowspan=3, colspan=1, sharex=ax1_a)
ax3_b = plt.subplot2grid((12,2),(11,0), rowspan=3, colspan=1, sharex=ax1_a)
ax3_b = ax3_a.twinx()

ax4_a = plt.subplot2grid((12,2),(0,1), rowspan=3, colspan=1)
ax4_b = plt.subplot2grid((12,2),(4,1), rowspan=3, colspan=1, sharex=ax4_a)
ax4_b = ax4_a.twinx()

ax5_a = plt.subplot2grid((12,2),(4,1), rowspan=3, colspan=1, sharex=ax4_a)
ax5_b = plt.subplot2grid((12,2),(8,1), rowspan=3, colspan=1, sharex=ax4_a)
ax5_b = ax5_a.twinx()

ax6_a = plt.subplot2grid((12,2),(8,1), rowspan=3, colspan=1, sharex=ax4_a)
ax6_b = plt.subplot2grid((12,2),(11,1), rowspan=3, colspan=1, sharex=ax4_a)
ax6_b = ax6_a.twinx()

# 定义绘图函数

def plot_drift(axx,label):
axx.plot(df.index[-lenght:], df[label][-lenght:], linestyle='-', lw=2,
label=label,color='b',alpha=1.00)

def plot_zscore(axx,label):
axx.plot(df.index[-lenght:], df[label][-lenght:], linestyle='-', lw=2,
label=label,color='g',alpha=1.00)

def vertical_labels_drift(axx):
axx.set_ylabel('Vols')
def vertical_labels_Zscore(axx):
axx.set_ylabel('Zscore')

def stdev(axx):
axx.axhline(2,linewidth=2,color='yellow') # standard deviations
axx.axhline(-2,linewidth=2,color='yellow') # standard deviations
axx.axhline(3,linewidth=2,color='red')
axx.axhline(-3,linewidth=2,color='red')


# plotting the drift
for i,j in zip([ax1_a,ax2_a,ax3_a,ax4_a,ax5_a,ax6_a],cols_drift):
plot_drift(i,j)
vertical_labels_drift(i)

# plotting the zscore
for i,j in zip([ax1_b,ax2_b,ax3_b,ax4_b,ax5_b,ax6_b], cols_drift_Z):
plot_zscore(i,j)
stdev(i)
vertical_labels_Zscore(i)

所以我的问题是,定义新情节进入子情节的正确方法是什么?因为如果您为 ax1_aax1_b 设置相同的位置,ax1_a 会被 ax1_b 覆盖,并且仅 ax1_b 被绘制出来。换句话说,如果您这样做:

ax1_a     = plt.subplot2grid((12,2),(0,0), rowspan=3, colspan=1)  # drift
ax1_b = plt.subplot2grid((12,2),(0,0), rowspan=3, colspan=1, sharex=ax1_a) # zscore drift
ax1_b = ax1_a.twinx()

ax1_a 将不会显示。

此外,我不明白为什么即使在显示的第一个代码中输入了错误的位置,我的图表也会显示。看起来即使您在执行 .twinx() 时将不同的位置放置到 ax1_bax2_b 等,它也会将该图表重置为执行 .twinx() 时引用的图表。

最佳答案

我觉得你误解了axes.twinx()的作用,你必须先实例化一个axes,用于第一组曲线(在左侧打勾),然后使用 .twinx() 获得克隆的,在其上绘制第二组曲线。

一个更简单的示例,您可以根据自己的问题进行调整

import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0,1,101)
nr, nc = 3, 2
fig, axes_array = plt.subplots(nrows=nr, ncols=nc)

for row_of_axes in axes_array:
for ax in row_of_axes:
ax.plot(t,np.sin(np.pi*t), color='black')
ax.twinx().plot(t,2*np.sin(np.pi*t)/(1.1-t), color='red')

fig.tight_layout()

enter image description here

<小时/>

附:更接近您的编码风格

...
for r, row_of_axes in enumerate(axes_array):
for c, ax_a in enumerate(row_of_axes):
ax_b = ax_a.twinx()
ax_a.plot(t,np.sin(np.pi*t), color='black', label='a %d %d'%(r,c))
ax_b.plot(t,2*np.sin(np.pi*t)/(1.1-t), color='red', label='b %d %d'%(r,c))
ax_a.legend(loc=1)
ax_b.legend(loc=3)

fig.tight_layout()

enter image description here

<小时/>

处理OP的评论/请求

您可以简单地使用列表列表来代替ndarray

nr, nc = 3, 2
axes_array = [[plt.subplot2grid((nr, nc), (r,c)) for c in range(nc)] for r in range(nr)]

请注意,这与我之前的代码不同,因为它没有给您一个确定 - 要应用紧凑布局,您可以像这样继续(未经测试,买者自负)

plt.gcf().tight_layout()

关于python - subplot2grid 内有 2 个图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37121007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com