【问题标题】:How to plot every label once in matplotlib legend with corresponding color? [duplicate]如何在matplotlib图例中用相应的颜色绘制每个标签一次? [复制]
【发布时间】:2022-01-20 23:03:13
【问题描述】:

我怎样才能在图例中只显示一次名称,用相应的颜色而不是索引?

data = {'x':[0, 1, 2, 3, 4],
        'y':[4, 3, 2, 1, 0], 
        'Name':['Tom', 'Nick', 'Tom', 'Nick', 'Emma'],
        'Color':['blue', 'red', 'blue', 'red', 'green']}
df = pd.DataFrame(data)

plt.figure()
plt.scatter(df['x'], df['y'], color = df['Color'], label = df['Name'])
plt.legend()

我知道这可以使用 Seaborn 完成,但我更喜欢在 Matplotlib 中完成(并且没有 for 循环)。

【问题讨论】:

  • 单独绘制每个点,如图所示here
  • @Mr.T 没有循环的方法吗?我知道这在 Seaborn 中是可能的,但我想直接在 matplotlib 中这样做
  • Matplotlib 每次调用 scatter 只支持一个标签。幸运的是,您可以使用 seaborn 或循环来解决问题。
  • @JohanC 那么Seaborn 会在内部执行循环吗?鉴于我已经有一个具有指定颜色的列,在我的情况下循环会是什么样子?
  • 你的进程有点不正常。通常,您有一些代码会根据名称创建 'Color' 列,例如使用字典。在这种情况下,您需要从数据帧中重建字典,例如color_dict = {name: color for name, color in zip(df['Name'], df['Color'])}。然后你可以使用sns.scatterplot(data=df, x='x', y='y', hue='Name', palette=color_dict)。或循环:for name in df['Name'].unique(): plt.scatter('x', 'y', data=df[df['Name']==name], color=color_dict[name], label=name)

标签: python python-3.x pandas matplotlib legend


【解决方案1】:

你可以试试这样的:

df.pivot(index='x', values='y', columns='Name').plot(style='.', markersize=15)

【讨论】:

  • 感谢您的建议!但是,如果我不想直接将 .plot 放在它后面而是创建一个新的 plt.plot(),我该如何绘制它?此外,现在颜色列中的颜色没有合并。
  • 您可以对 df 进行排序以获得唯一名称,然后获取相应的颜色列表,并将其作为 color=retrieved_colorlist 提供给绘图函数。请注意,虽然这个图看起来像一个散点图,但它确实是一个没有线条的线图。根据您之后打算对该图执行的操作,代码的行为可能会有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2019-03-23
  • 2018-03-27
  • 2017-07-31
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多