如何在MatPlotLib(Python3.9)中为多数据集设置同一图例标签?
在Matplotlib中让多条线共用同一图例标签并保持同色
当然可以实现,你的问题出在每次调用plot都重复设置了相同标签,且没有指定统一颜色,导致Matplotlib默认循环分配颜色并生成多个图例条目。下面是几种可行的解决方法:
方法一:仅首次绘图设置标签,指定统一颜色
这是最直接的方式,循环中只有第一条线设置图例标签,后续线条只指定颜色不设置标签:
import matplotlib.pyplot as plt dataX = [[0, 1, 2], [0, 1, 2]] dataY = [[0, 1, 2], [2, 1, 0]] dataLabel = "Test Data" # 指定统一颜色,也可以用Matplotlib预设的颜色,比如plt.rcParams['axes.prop_cycle'].by_key()['color'][0] line_color = '#1f77b4' for i in range(len(dataX)): # 仅第一次绘图时设置图例标签,后续不设置 plt.plot(dataX[i], dataY[i], color=line_color, label=dataLabel if i == 0 else "") plt.legend(loc='best') plt.show() plt.close()
方法二:绘制完成后手动生成图例
如果已经绘制完所有线条,可通过获取绘图句柄来手动创建只包含一个条目的图例:
import matplotlib.pyplot as plt dataX = [[0, 1, 2], [0, 1, 2]] dataY = [[0, 1, 2], [2, 1, 0]] dataLabel = "Test Data" line_color = '#1f77b4' # 绘制所有线条,不设置标签 for i in range(len(dataX)): plt.plot(dataX[i], dataY[i], color=line_color) # 获取绘图句柄,用第一个句柄创建图例 handles, _ = plt.gca().get_legend_handles_labels() plt.legend([handles[0]], [dataLabel], loc='best') plt.show() plt.close()
方法三:完全自定义图例条目
通过Line2D手动构建图例元素,适合需要更灵活控制图例样式的场景:
import matplotlib.pyplot as plt from matplotlib.lines import Line2D dataX = [[0, 1, 2], [0, 1, 2]] dataY = [[0, 1, 2], [2, 1, 0]] dataLabel = "Test Data" line_color = '#1f77b4' # 绘制所有线条 for i in range(len(dataX)): plt.plot(dataX[i], dataY[i], color=line_color) # 手动创建图例条目 custom_legend = [Line2D([0], [0], color=line_color, lw=2, label=dataLabel)] plt.legend(handles=custom_legend, loc='best') plt.show() plt.close()
以上三种方法都能实现你要的效果:两条线颜色一致,且图例只显示一个"Test Data"条目。
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

