我试图在一个图中绘制多个系列。在这将近 10 个系列中,还有两个更重要的系列。我想让图例中的标签显示在图下的几行中(使用图例的 ncols
参数),但我希望第一行只有这两个更重要的标签。可能吗?
答案 0 :(得分:1)
你可以简单地排列 ax.plot 语句的顺序,得到图例第一行的重要图例。在以下示例中,三次和对数图例是我们想要出现在第一行的图例。
import math
x_data = list(range(1,10))
y1 = [3*x for x in x_data]
y2 = [x**2 for x in x_data]
y3 = [x**3 for x in x_data]
y4 = [math.log10(x) for x in x_data]
y5 = [x*math.log10(x) for x in x_data]
fig, ax = plt.subplots()
ax.plot(x_data,y3, label= 'Cubic')#important 1
ax.plot(x_data,y1, label= 'Linear')
ax.plot(x_data,y2, label= 'Quadratic')
ax.plot(x_data,y4, label= 'Logarithmic')#important 2
ax.plot(x_data,y5, label = 'x log x')
fig.legend(loc = 'upper center',
bbox_to_anchor = (0.5,0.8),
ncol = 2)
plt.show()
更新:要在第一行有 2 个图例项,在第二行有其余的项,您需要有两个单独的图例。实现这一目标的最佳方法是拥有双 y 轴,并在一个轴上绘制重要数据,在另一轴上绘制其余数据。然后,您必须确保将 y 限制设置为彼此相等,并为每个数据集指定颜色。这允许您将第一个轴图例的 ncol = 2 设置为其他轴图例的其他数字。最后,您可以利用legend() 中的许多参数使两个图例看起来像一个。方法如下:
import math
x_data = list(range(1,10))
y1 = [3*x for x in x_data]
y2 = [x**2 for x in x_data]
y3 = [x**3 for x in x_data]
y4 = [math.log10(x) for x in x_data]
y5 = [x*math.log10(x) for x in x_data]
fig = plt.figure(figsize=(12,5))
fig.suptitle("Title")
ax1 = fig.add_subplot()
ax2 = ax1.twinx()
ax1.plot(x_data,y3, label= 'Cubic', color = 'blue')#important 1
ax1.plot(x_data,y4, label= 'Logarithmic', color = 'orange')#important 2
ax2.plot(x_data,y1, label= 'Linear', color = 'red')
ax2.plot(x_data,y2, label= 'Quadratic', color = 'green')
ax2.plot(x_data,y5, label = 'x log x', color = 'purple')
ax2.set_ylim(ax1.get_ylim()) #set the ylimits to be equal for both y axes
ax1.legend(loc = 'upper center',
bbox_to_anchor = (0.5,0.91),
edgecolor = 'none',
facecolor = 'grey',
framealpha = 0.3,
ncol = 2)
ax2.legend(loc = 'upper center',
bbox_to_anchor = (0.5,0.85),
edgecolor = 'none',
facecolor = 'grey',
framealpha = 0.3,
ncol = 3)
plt.show()