Python 3.x Matplotlib图例按递增顺序排列
我有名为5.txt、10.txt、15.txt、20.txt的文本文件,但当我使用glob模块读取文件并在图例中使用fname变量时,我会得到无序的图例数据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
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)