我想迭代列表并绘制每个列表的箱线图。因为数据不能全部放入内存中,所以我不能指定预定数量的箱图来绘制,所以我使用子图函数迭代地添加图。
我的问题是没有使用箱线图将轴标签添加到图中,只显示最后一个标签。如何用子图迭代地标记箱图。
我想要做的简化示例如下。虽然实际上我实际上是在循环中回收相同的列表而不是迭代列表列表,但它用于说明问题。因为只能看到' lb'设置在y轴中,情节没有显示' la'对于第一个底部箱图,
感谢。
%matplotlib inline
import matplotlib.pyplot as plt
la = [24, 28, 31, 34, 38, 40, 41, 42, 43, 44]
lb = [5, 8, 10, 12, 15, 18, 21, 25, 30, 39]
names = ['la', 'lb']
myList = [la] + [lb]
myList
# set fig for boxplots
fig, ax = plt.subplots(sharex=True)
# Add a horizontal grid to the plot
ax.xaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5)
ax.set_axisbelow(True)
ax.set_title('Some Title')
for i,l in enumerate(myList):
ax.boxplot(l, vert=False, positions = [i])
ax.set_yticklabels([names[i]])
ax.set_ylim(-0.5, len(myList)-0.5)
答案 0 :(得分:2)
在循环内设置标签将覆盖之前的ticklabel。所以标签应该设置在循环之外。您还需要确保两个标签实际上都有刻度。
因此,解决方案是添加
ax.set_yticks(range(len(myList)))
ax.set_yticklabels(names)
在循环之外。
完整代码:
import matplotlib.pyplot as plt
la = [24, 28, 31, 34, 38, 40, 41, 42, 43, 44]
lb = [5, 8, 10, 12, 15, 18, 21, 25, 30, 39]
names = ['la', 'lb']
myList = [la] + [lb]
myList
# set fig for boxplots
fig, ax = plt.subplots(sharex=True)
# Add a horizontal grid to the plot
ax.xaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5)
ax.set_axisbelow(True)
ax.set_title('Some Title')
for i,l in enumerate(myList):
ax.boxplot(l, vert=False, positions = [i])
ax.set_yticks(range(len(myList)))
ax.set_yticklabels(names)
ax.set_ylim(-0.5, len(myList)-0.5)
plt.show()