[英]How to make two markers share the same label in the legend using matplotlib?
[英]How to fix this legend to place the label beside the markers
我将如何修复此图例,以便将标签(数值)放置在图例条目/标记旁边
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
from matplotlib.lines import Line2D
np.random.seed(0)
df0 = pd.DataFrame(np.random.randint(0,1000,size=(18, 4)),
columns=list('ABCD'))
ax = df0.plot()
mrkr = ['o', '.', 'v', 'x']
mrkr_df = pd.DataFrame(mrkr)
idx_mx_vals = df0.abs().idxmax().to_list()
mx_vals = df0.to_numpy()[idx_mx_vals,
np.arange(len(idx_mx_vals))].tolist()
legend_elements = []
for x, y, m, line, j in zip(idx_mx_vals, mx_vals, mrkr, ax.lines, mx_vals):
line2 = ax.plot(x, y, marker=m, c=line.get_color(), markersize=7, label=j)
legend_elements.append(Line2D([0], [0], c=line.get_color(), marker=m))
leg1 = ax.legend(loc='upper right')
如所附照片所示所需的 Output
您创建了一个图例元素列表,但从未将其传递给ax.legend
。
leg1 = ax.legend(handles=legend_elements,
labels=list(map(str, mx_vals)),
loc='upper right')
或者,您可以在构建Line2D
时直接传递正确的label
,这样您就不必将它传递给ax.legend
。
legend_elements = []
for x, y, m, line in zip(idx_mx_vals, mx_vals, mrkr, ax.lines):
kwargs = dict(marker=m, c=line.get_color(), markersize=7, label=str(y)) # <--- Label is here.
line2 = ax.plot(x, y, **kwargs)
legend_elements.append(Line2D([], [], **kwargs)
leg1 = ax.legend(legend_elements, loc='upper right')
编辑:要回答您关于将列名保留在图例中的评论,只需遍历 zip 中的columns
并相应地调整 label 即可:
for x, y, m, line, column in zip(idx_mx_vals, mx_vals, mrkr, ax.lines, columns):
kwargs = dict(marker=m, c=line.get_color(), markersize=7, label=f"{column} ({y})"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.