簡體   English   中英

如何修復此圖例以將 label 放置在標記旁邊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM