以下问题是在一个小样本中,无论我使用什么标签,matplotlib都按照我给定的x / y数组的顺序绘制。当数据集增加时,它只是不适用。
data = {a:1, b:2, c:3}
def plot_bar_new(data, reverse):
data = sorted(data.items(), key=lambda x:x[1], reverse=reverse)
plotx, ploty = zip(*data) # replaces the for-loop from plot_bar()
locs = range(0, len(ploty))
plt.figure()
plt.bar(locs, ploty)
plt.xticks(locs, plotx)
plt.show()
plot_bar_new({1: 1, 2: 2, 3: 3}, False)
答案 0 :(得分:1)
问题在于您假设plotx
是将按列出的顺序在X轴上绘制的标签列表。实际上,plotx
是X轴上绝对位置的列表,在该位置上将绘制对应的Y值。由于默认的X轴从左到右升序,因此您在plotx
中列出位置的顺序无关紧要。
考虑以下绘图功能,通过将plotx
参数设置为reverse
或True
,可以按降序或升序对False
进行排序:
def plot_bar(data, reverse):
data = sorted(data.items(), key=lambda x:x[1], reverse=reverse)
plotx =[]
ploty =[]
for item in data:
plotx.append(item[0])
ploty.append(item[1])
plt.figure()
plt.bar(plotx, ploty)
plt.show()
以plotx
升序绘制:
plot_bar({1: 1, 2: 2, 3: 3}, False)
现在以plotx
降序排列:
plot_bar({1: 1, 2: 2, 3: 3}, True)
如您所见,plotx
中的位置顺序无关紧要。
要按照ploty
中列出的Y值来绘制Y值,可以创建要在locs
中使用的位置plt.bar()
的新列表,并使用plotx
作为这些位置的标签:
def plot_bar_new(data, reverse):
data = sorted(data.items(), key=lambda x:x[1], reverse=reverse)
plotx, ploty = zip(*data) # replaces the for-loop from plot_bar()
locs = range(0, len(ploty))
plt.figure()
plt.bar(locs, ploty)
plt.xticks(locs, plotx)
plt.show()
plot_bar_new({1: 1, 2: 2, 3: 3}, False)
plot_bar_new({1: 1, 2: 2, 3: 3}, True)