Python - 如何通过双x轴增加matplotlib图形的尺寸

3

我有一个使用matplotlib创建的图表,使用twinx()函数显示具有不同y值的两个不同的绘图:

plt.plot(Current_Time[1000:66000],Avg_Duration[1000:66000],color='blue',label="Average Duration of All Parked Cars")
#plt.figure(figsize=(10,10))
plt.legend(loc='upper left')
plt.ylim(0,50000)
plt.ylabel('Duration in Seconds')
plt.xticks(rotation=90)
plt2=plt.twinx()
#plt2.figure(figsize=(10,10))
plt2.plot(Current_Time[1000:66000],Quantity[1000:66000],color='purple',label='Quantity of Cars Parked')
plt2.set_ylabel('Cars Parked')
plt2.legend(loc='upper right')
plt.show()

我遇到的问题是,当我尝试增加图表的大小时,它会将图表分成两个。有没有办法增加绘图区域的大小而不会分成两个图表?


1
无法重现的代码,没有图片,你在这里期待什么?在显示之前尝试使用plt.tight_layout() - sascha
@sascha,这段代码很容易复制。任何随机的Current_Time、Avg_Duration和Quantity值列表都可以。我已经搜索了matplotlib文档,但没有找到相关内容。只是想知道在增加大小时是否有一种方法可以保持两个图表重叠? - Jeff Saltfist
1
在SO(指Stack Overflow)上实现可重现性: 复制问题代码,运行并观察。但是这种方法在这里肯定不起作用。当然,不同的数据看起来会很不同,而随机列表可以是任何东西,至少一些不同的分布情况,其中一些与其他分布非常不同。 - sascha
@Jeff 当询问错误或不良行为时,必须提供一个 [mcve]。虽然在这种情况下,您认为替换列表和猜测导入已足够,但实际上并非如此。添加导入和随机列表后运行示例可以正常工作。但是,您正在询问一个不良行为,这个行为(我们需要猜测)来自取消注释两行代码。这样做会引发与您描述的结果不同的错误。因此,很多人将不会进一步查看问题,并且您将无法获得快速答案。 - ImportanceOfBeingErnest
1个回答

5
在任何大小的图中创建双轴都是可能的。您只需要确保理解自己编写的代码。不要使用figure创建新图,然后抱怨出现了第二个图。
遵循matplotlib状态机界面,一个解决方案可能如下:
import matplotlib.pyplot as plt
import numpy as np

#get data
x=np.arange(40)
y=np.random.rand(len(x))*20000+30000
y2=np.random.rand(len(x))*0.5
#create a figure
plt.figure(figsize=(10,10))
#plot to first axes
plt.plot(x,y,color='blue',label="label1")
plt.ylim(0,50000)
plt.ylabel('ylabel1')
plt.xticks(rotation=90)
#create twin axes
ax2=plt.gca().twinx()
#plot to twin axes
plt.plot(x,y2,color='purple',label='label2')
plt.ylabel('ylabel2')
plt.legend(loc='upper right')
plt.show()

或者,如果您更喜欢使用matplotlib API:

import matplotlib.pyplot as plt
import numpy as np

#get data
x=np.arange(40)
y=np.random.rand(len(x))*20000+30000
y2=np.random.rand(len(x))*0.5
#create a figure
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111)
#plot to first axes
ax.plot(x,y,color='blue',label="label1")
ax.set_ylim(0,50000)
ax.set_ylabel('ylabel1')
ax.set_xticklabels(ax.get_xticklabels(),rotation=90)
#create twin axes
ax2=ax.twinx()
#plot to twin axes
ax2.plot(x,y2,color='purple',label='label2')
ax2.set_ylabel('ylabel2')

h1, l1 = ax.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax.legend(handles=h1+h2, labels=l1+l2, loc='upper right')
plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接