如何使用python更改子图中的x和y轴?

时间:2018-10-20 20:33:12

标签: python matplotlib

因此,我尝试使用以下数据:[1,2,3], [3,4,5]绘制垂直条形图, 水平条形图和一个pyplot图中的空白图,看起来像 此示例中的图片:

enter image description here

,但到目前为止,我的代码对这里的绘制略有不同。在条形图1上查看x轴,在水平条形图2上查看y轴。我正在尝试使条形图1的x轴看起来像barh上的y轴。现在数字不是小数点(例如1.0、2.0),也没有显示1.5、2.5和3.5的数字。 (由于unutbu的解释,我取得了一些进步):

another updated image

请在下面查看我的更新代码,我是绘图的新手 并且仍在尝试了解其工作原理:

import matplotlib.pyplot as plt
import numpy as np
plt.close()
fig, ax = plt.subplots(ncols=3)

sid = [1, 2, 3]
bel = [3, 4, 5]

y_pos = np.arange(len(sid))+1.5
ax[0].bar(y_pos, bel, align='center', alpha=0.5)
ax[0].set_xticks(y_pos, sid)
ax[0].set_xlim(1.0,4.0)
ax[0].set_ylim(0, 5)

y_pos = np.arange(len(sid)) + 1
ax[1].barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)
ax[1].set_yticks(np.linspace(1, 4, 7))
ax[1].set_xticks(np.arange(0,6,1))
ax[1].set_ylim(1, 4)

sid = []
bel = []
y_pos = np.arange(len(sid))
ax[2].barh(y_pos, bel, align='center', alpha=0.5)
ax[2].set_yticks([0.0,0.2,0.4,0.6,0.8,1.0])
ax[2].set_xticks([0.0,0.2,0.4,0.6,0.8,1.0])
ax[2].set_ylim(0, 1)

plt.tight_layout()
plt.show()

1 个答案:

答案 0 :(得分:0)

让我们集中在中轴上。您可以使用

y_pos = np.arange(len(sid))+1
plt.barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)
plt.yticks(np.linspace(1, 4, 7))
plt.ylim(1, 4)

以产生所需的结果。请注意,在y_pos上加1会使y_pos等于 array([1, 2, 3]),因为将常量添加到NumPy数组会将常量添加到数组中的每个元素:

In [11]: np.arange(len(sid))
Out[11]: array([0, 1, 2])

In [12]: np.arange(len(sid))+1
Out[12]: array([1, 2, 3])

因此,plt.barh(y_pos, ..., align='edge')将条的底部边缘放置在y,1、2、3位置。


np.linspace(1, 4, 7)生成7个等间距值,介于1和4之间:

In [13]: np.linspace(1, 4, 7)
Out[13]: array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. ])

plt.yticks(np.linspace(1, 4, 7))告诉matplotlib标记这些位置。


plt.ylim(1, 4)设置y轴的y范围为1到4。


就风格而言,您可能需要考虑切换到"object-oriented" style of matplotlib programming。您可以使用

而不是调用plt.subplot(1, 3, 2)来激活3个轴中的第二个
fig, ax = plt.subplots(ncols=3)

生成3个轴。这会给您一个ax对象,它是3轴的序列。

以这种方式进行编码的吸引力在于,您现在有了一个“物理”对象,可以向其发送命令。

之前,当您关注

之类的一行时
plt.barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)

目前尚不清楚条形图将显示在哪些轴上。 现在,使用面向对象的matplotlib编码样式,该命令将为

ax[1].barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)

所以您会立即知道第二根轴正在绘制。

尽管您的程序可能会更冗长(即更多键入) 越来越复杂,我想您会发现“面向对象”风格的产生 更清晰,更易读的代码。

这是您的代码的样子:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(ncols=3)

sid = [1, 2, 3]
bel = [3, 4, 5]

y_pos = np.arange(len(sid)) + 1
ax[0].bar(y_pos, bel, width=0.9, align='edge', alpha=0.5)
ax[0].set_xticks(np.linspace(1, 4, 7))
ax[0].set_ylim(0, 5)

ax[1].barh(y_pos, bel, height=0.9, align='edge', alpha=0.5)
ax[1].set_yticks(np.linspace(1, 4, 7))
ax[1].set_xticks(np.arange(0,6,1))
ax[1].set_ylim(1, 4)

sid = []
bel = []
y_pos = np.arange(len(sid))
ax[2].barh(y_pos, bel, align='center', alpha=0.5)
ax[2].set_yticks([0.0,0.2,0.4,0.6,0.8,1.0])
ax[2].set_xticks([0.0,0.2,0.4,0.6,0.8,1.0])
ax[2].set_ylim(0, 1)

plt.tight_layout()
plt.show()

enter image description here