Python 3.x Matplotlib图例按递增顺序排列

Python 3.x Matplotlib图例按递增顺序排列,python-3.x,matplotlib,Python 3.x,Matplotlib,我有名为5.txt、10.txt、15.txt、20.txt的文本文件,但当我使用glob模块读取文件并在图例中使用fname变量时,我会得到无序的图例数据 for fname in glob("*.txt"): potential, current_density = np.genfromtxt(fname, unpack=True) current_density = current_density*1e6 ax = plt.gca() ax.get_yax

我有名为5.txt、10.txt、15.txt、20.txt的文本文件,但当我使用glob模块读取文件并在图例中使用fname变量时,我会得到无序的图例数据

for fname in glob("*.txt"):

    potential, current_density = np.genfromtxt(fname, unpack=True)
    current_density = current_density*1e6
    ax = plt.gca()
    ax.get_yaxis().get_major_formatter().set_useOffset(False)
    plt.plot(potential,current_density, label=fname[0:-4])

plt.legend(loc=4,prop={'size':12}, 
           ncol=1, shadow=True, fancybox=True,
           title = "Scan rate (mV/s)")

如何以递增的顺序绘制数据并为其提供相应的标签?

方法1(推荐)

您需要自己对图例进行排序和显示。将行列表和字符串列表作为前两个可选的位置参数。您可以维护所需项目的列表,按所需顺序排序,并将所需部分传递给
legend

ax = plt.gca() legend_items = [] for fname in glob("*.txt"): potential, current_density = np.genfromtxt(fname, unpack=True) current_density *= 1e6 line, = ax.plot(potential, current_density) name = fname[0:-4] legend_items.append((int(name), line, name)) legend_items.sort() ax.get_yaxis().get_major_formatter().set_useOffset(False) ax.legend([x[1] for x in legend_items], [x[2] for x in legend_items], loc=4, prop={'size':12}, ncol=1, shadow=True, fancybox=True, title = "Scan rate (mV/s)")
您将不得不自己进行名称筛选,但这并不特别困难。排序键就是数字。另外,您会注意到,我已经厌倦了为这个更新做自定义的花式格式:)

只是为了提供另一种方法,它不需要更改脚本打印部分的任何内容:

handles, labels = plt.gca().get_legend_handles_labels()
handles, labels = zip(*[ (handles[i], labels[i]) for i in sorted(range(len(handles)), key=lambda k: list(map(int,labels))[k])] )
plt.legend(handles, labels, loc=4, ...)

不知道这是否如此相关,但我最终还是来到了这里——我发现我不需要中间线——如果你想要两个专栏,这对我来说很有用

handles, labels = plt.gca().get_legend_handles_labels()
plt.legend(handles, labels, loc=4,
       ncol=2, shadow=True, title="Legend", fancybox=True)

很不错的。我试图避免在第二行解释转置操作,但我很高兴看到一个完整的答案。另外,如果你考虑把那个怪物一行分解成三个操作(转置、排序、转置),排序键会更清晰。我实际上是在一行中把它全部弄到手,但效果不太好。实际上,这更多的是为了好玩。在真实的应用程序中,我会选择一种类似于方法1的方法。如果调用
get_legend\u handles\u labels
四次(分别获取
handles
labels
),并在转置上使用星号展开:
plt.legend(*zip)[(plt.gca().get_legend\u handles\u labels()[0][i] ,plt.gca().get_legend_handles_labels()[1][i])为i排序(范围(len(plt.gca().get_legend_handles_labels()[0])),key=lambda k:list(map(int,plt.gca().get_legend_handles_labels()[1])[k]),loc=4,
。享受!这是关于排序图例项的原因吗?您只是把图例框变成了一个两列框。
handles, labels = plt.gca().get_legend_handles_labels()
plt.legend(handles, labels, loc=4,
       ncol=2, shadow=True, title="Legend", fancybox=True)