因此,我尝试使用以下数据:[1,2,3], [3,4,5]
绘制垂直条形图,
水平条形图和一个pyplot图中的空白图,看起来像
此示例中的图片:
,但到目前为止,我的代码对这里的绘制略有不同。在条形图1上查看x轴,在水平条形图2上查看y轴。我正在尝试使条形图1的x轴看起来像barh上的y轴。现在数字不是小数点(例如1.0、2.0),也没有显示1.5、2.5和3.5的数字。 (由于unutbu的解释,我取得了一些进步):
请在下面查看我的更新代码,我是绘图的新手 并且仍在尝试了解其工作原理:
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()
答案 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()