Matplotlib图不反映有序数据集

时间:2018-10-05 09:52:15

标签: python-2.7 matplotlib plot

以下问题是在一个小样本中,无论我使用什么标签,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)
  1. 我想了解为什么matplotlib不按用户给出的顺序绘制数据
  2. 我希望按值的降序绘制流式传输的数据
  3. 以及在x标签上按原样打印的键
  4. 但是数据非常庞大,我只能看到第300个x标签。

1 个答案:

答案 0 :(得分:1)

问题在于您假设plotx是将按列出的顺序在X轴上绘制的标签列表。实际上,plotx是X轴上绝对位置的列表,在该位置上将绘制对应的Y值。由于默认的X轴从左到右升序,因此您在plotx中列出位置的顺序无关紧要。

考虑以下绘图功能,通过将plotx参数设置为reverseTrue,可以按降序或升序对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)

enter image description here

现在以plotx降序排列:

plot_bar({1: 1, 2: 2, 3: 3}, True)

enter image description here

如您所见,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)

enter image description here

plot_bar_new({1: 1, 2: 2, 3: 3}, True)

enter image description here