Mil*_*lad 8 python matplotlib pandas subplot
我想要做的是在子图中的2x2图表.然后,对于每个图,我将使用两个y轴.因此,我为每个图使用了twinx()方法.您在我分享的图中看到的问题是它没有显示第一行的xlabel和xticks.对于第二行,一切都很好.我在图中用红色字体指定了问题("No xlabel and xticks !!!").
每个图都有自己的x轴和y轴,并且没有共享.
我已经调整了很多代码并缩小了问题制定者的范围.这是因为我在上排使用twinx().如果我尝试删除辅助y轴,一切都恢复正常,上行的xlabel和ylabel正确显示.
我不知道是什么问题!
这是我正在处理的代码.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from io import StringIO
s = StringIO(u""" amount price
A 40929 4066443
B 93904 9611272
C 188349 19360005
D 248438 24335536
E 205622 18888604
F 140173 12580900
G 76243 6751731
H 36859 3418329
I 29304 2758928
J 39768 3201269
K 30350 2867059""")
df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)
fig = plt.figure()
ax_2 = fig.add_subplot(222, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.plot([1, 3, 5, 7, 9])
ax_22.plot([1.0/x for x in [1, 3, 5, 7, 9]])
ax_2.set_xlabel("AX2 X Lablel")
ax_2.set_ylabel("AX2 Y Lablel")
ax_22.set_ylabel("AX2_Twin Y Lablel")
ax_2 = fig.add_subplot(223, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.plot([100, 300, 500, 700, 900])
ax_22.plot([x*x for x in [100, 300, 500, 700, 900]])
ax_2.set_xlabel("AX3 X Lablel")
ax_2.set_ylabel("AX3 Y Lablel")
ax_22.set_ylabel("AX3_Twin Y Lablel")
ax_2 = fig.add_subplot(224, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.set_xlabel("AX4 X Lablel")
ax_2.set_ylabel("AX4 Y Lablel")
ax_22.set_ylabel("AX4_Twin Y Lablel")
ax = fig.add_subplot(221, sharex=None, sharey=None)
ax2 = ax.twinx()
width = 0.4
df.amount.plot(kind='bar', color='red', ax=ax, width=width, position=1, sharex=False, sharey=False)
df.price.plot(kind='bar', color='blue', ax=ax2, width=width, position=0, sharex=False, sharey=False)
ax.set_xlabel("Alphabets")
ax.set_ylabel('Amount')
ax2.set_ylabel('Price')
plt.subplots_adjust(wspace=0.8, hspace=0.8)
plt.savefig("t1.png", dpi=300)
plt.show()
Run Code Online (Sandbox Code Playgroud)
它生成以下图:
编辑:
谢谢你的回答.但是,在绘制图表时使用Pandas时,我的问题仍然存在.我提出了一个新问题.请看一下:
您提供的代码似乎产生了所需的结果。
这让我认为您的控制台或 matplotlib 版本存在问题 - 也许您可以提供有关如何运行代码的更多信息。
我建议移动ax.set_xlabel
之前的内容twinx
,例如:
ax_2 = fig.add_subplot(222, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.set_xlabel("AX2 X Lablel")
ax_2.plot([1, 3, 5, 7, 9])
# Becomes...
ax_2 = fig.add_subplot(222, sharex=None, sharey=None)
ax_2.set_xlabel("AX2 X Lablel")
ax_2.plot([1, 3, 5, 7, 9])
ax_22 = ax_2.twinx()
Run Code Online (Sandbox Code Playgroud)
编辑我建议使用gridspec代替。请参阅下面的工作示例:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gspec
import numpy as np
fig = plt.figure()
gs = gspec.GridSpec(2, 2)
gs.update(hspace=0.7, wspace=0.7)
ax1 = plt.subplot(gs[0, 0])
ax2 = plt.subplot(gs[1, 0])
ax3 = plt.subplot(gs[0, 1])
ax4 = plt.subplot(gs[1, 1])
x1 = np.linspace(1,10,10)
ax1.plot(x1, x1**2)
ax1.set_xlabel('ax1 x')
ax1_2 = ax1.twinx()
ax1_2.plot(x1, x1**3)
ax1_2.set_ylabel('ax1_2 y')
ax1.set_ylabel('ax1 y')
# To save time I left the other cells blank, but it should work fine.
plt.show()
Run Code Online (Sandbox Code Playgroud)
上面的结果是:
这就是我处理此类问题的方式。首先,尝试通过将代码减少到最少来隔离问题。例如,此代码显示了相同的问题:
fig = plt.figure()
fig.add_subplot(212)
ax = fig.add_subplot(211)
ax2 = ax.twinx()
pd.Series(range(10)).plot(ax=ax)
Run Code Online (Sandbox Code Playgroud)
现在我们可以看到两件事:
如果我仅用5行代码就犯了一个错误,那么应该很容易找到它(至少比使用原始代码要容易)。由于我找不到任何错误,所以我猜这是熊猫或matplotlib中的错误。根据评论,这可能是matplotlib 1.5.1中引入的回归。
此代码中有两件异常的事情:
不寻常的事情更有可能触发底层库中的隐藏错误,因此,如果可能的话,最好避免它们。现在让我们看看如果按照通常的自上而下的顺序创建子图会发生什么:
fig = plt.figure()
ax = fig.add_subplot(211)
ax2 = ax.twinx()
pd.Series(range(10)).plot(ax=ax)
fig.add_subplot(212)
Run Code Online (Sandbox Code Playgroud)
看来可行,所以让我们尝试使用原始代码:
fig = plt.figure()
ax = fig.add_subplot(221, sharex=None, sharey=None)
ax2 = ax.twinx()
width = 0.4
df.amount.plot(kind='bar', color='red', ax=ax, width=width, position=1, sharex=False, sharey=False)
df.price.plot(kind='bar', color='blue', ax=ax2, width=width, position=0, sharex=False, sharey=False)
ax_2 = fig.add_subplot(222, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.plot([1, 3, 5, 7, 9])
ax_22.plot([1.0/x for x in [1, 3, 5, 7, 9]])
ax_2.set_xlabel("AX2 X Lablel")
ax_2.set_ylabel("AX2 Y Lablel")
ax_22.set_ylabel("AX2_Twin Y Lablel")
ax_2 = fig.add_subplot(223, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.plot([100, 300, 500, 700, 900])
ax_22.plot([x*x for x in [100, 300, 500, 700, 900]])
ax_2.set_xlabel("AX3 X Lablel")
ax_2.set_ylabel("AX3 Y Lablel")
ax_22.set_ylabel("AX3_Twin Y Lablel")
ax_2 = fig.add_subplot(224, sharex=None, sharey=None)
ax_22 = ax_2.twinx()
ax_2.set_xlabel("AX4 X Lablel")
ax_2.set_ylabel("AX4 Y Lablel")
ax_22.set_ylabel("AX4_Twin Y Lablel")
ax.set_xlabel("Alphabets")
ax.set_ylabel('Amount')
ax2.set_ylabel('Price')
plt.subplots_adjust(wspace=0.8, hspace=0.8)
plt.savefig("t1.png", dpi=300)
plt.show()
Run Code Online (Sandbox Code Playgroud)
因此,通过一种变通方法解决了问题(至少对我而言)。实际的修复方法会更好,但完美的方法是善良的敌人,现在,子图以更合理的顺序创建,从而提高了可读性。
归档时间: |
|
查看次数: |
3928 次 |
最近记录: |