Seaborn regplot的自定义图例(Python 3)

2024-10-01 17:38:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在试图理解这个问题,但我认为有些东西在翻译过程中丢失了。我为我的绘图中的不同类型的点使用了一个自定义的颜色映射,我希望能够用这些颜色标签对放置一个表格。我将信息存储在字典D_color_label中,然后生成两个平行列表colors和{}。我试着在ax.legend中使用它,但似乎没用。在

np.random.seed(0)

# Create dataframe
DF_0 = pd.DataFrame(np.random.random((100,2)), columns=["x","y"])

# Label to colors
D_idx_color = {**dict(zip(range(0,25), ["#91FF61"]*25)),
               **dict(zip(range(25,50), ["#BA61FF"]*25)),
               **dict(zip(range(50,75), ["#916F61"]*25)),
               **dict(zip(range(75,100), ["#BAF1FF"]*25))}

D_color_label = {"#91FF61":"label_0",
                 "#BA61FF":"label_1",
                 "#916F61":"label_2",
                 "#BAF1FF":"label_3"}

# Add color column
DF_0["color"] = pd.Series(list(D_idx_color.values()), index=list(D_idx_color.keys()))

# Plot
fig, ax = plt.subplots(figsize=(8,8))
sns.regplot(data=DF_0, x="x", y="y", scatter_kws={"c":DF_0["color"]}, ax=ax)

# Add custom legend
colors = list(set(DF_0["color"]))
labels = [D_color_label[x] for x in set(DF_0["color"])]

# If I do this, I get the following error:
# ax.legend(colors, labels)
# UserWarning: Legend does not support '#BA61FF' instances.
# A proxy artist may be used instead.

enter image description here


Tags: df颜色nprangerandomzipaxlabel
1条回答
网友
1楼 · 发布于 2024-10-01 17:38:53

根据http://matplotlib.org/users/legend_guide.html你必须把功能艺术家的传奇功能,这将被标记。要单独使用scatter_plot,必须按颜色对数据进行分组,并单独绘制一种颜色的每个数据,以便为每个艺术家设置自己的标签:

import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import seaborn as sns

np.random.seed(0)

# Create dataframe
DF_0 = pd.DataFrame(np.random.random((100,2)), columns=["x","y"])
DF_0['color'] =  ["#91FF61"]*25 + ["#BA61FF"]*25 + ["#91FF61"]*25 + ["#BA61FF"]*25
#print DF_0

D_color_label = {"#91FF61":"label_0",
                 "#BA61FF":"label_1",
                 "#916F61":"label_2",
                 "#BAF1FF":"label_3"}
colors = list(set(DF_0["color"]))
labels = [D_color_label[x] for x in set(DF_0["color"])]

ax = sns.regplot(data=DF_0, x="x", y="y", scatter_kws={'c':DF_0['color'], 'zorder':1})

# Make a legend
# groupby and plot points of one color
ind = 0
for i, grp in DF_0.groupby(['color']):
    grp.plot(kind = 'scatter', x = 'x', y = 'y', c = i, ax = ax, label = labels[ind], zorder = 0)
    ind += 1       
ax.legend(loc=2)

plt.show()

enter image description here

相关问题 更多 >

    热门问题