简体   繁体   English

pandas - 散布 plot,每个点都有不同的颜色图例

[英]pandas - scatter plot with different color legend for each point

Starting from the following example:从以下示例开始:

fig, ax = plt.subplots()

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']})

for label in df['l']:

    df.plot('n1','n2', kind='scatter', ax=ax, s=50, linewidth=0.1, label=label)

what I obtained is the following scatterplot:我得到的是以下散点图:

在此处输入图像描述

I'm now trying to set a different color for each of the four points.我现在正在尝试为四个点中的每一个设置不同的颜色。 I know that I can loop over a set of, for instance, 4 colors in a list like:我知道我可以在列表中循环一组,例如 4 colors,例如:

colorlist = ['b','r','c','y']

but since my real dataset comprise at least 20 different points, I was looking for a sort of "color generator" to loop within it.但由于我的真实数据集至少包含 20 个不同的点,所以我一直在寻找一种“颜色生成器”在其中循环。

The following method will create a list of colors as long as your dataframe, and then plot a point with a label with each color:以下方法将创建一个与数据框一样长的颜色列表,然后用每种颜色的标签绘制一个点:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as colors
import numpy as np
import pandas as pd

fig, ax = plt.subplots()

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']})

colormap = cm.viridis
colorlist = [colors.rgb2hex(colormap(i)) for i in np.linspace(0, 0.9, len(df['l']))]

for i,c in enumerate(colorlist):

    x = df['n1'][i]
    y = df['n2'][i]
    l = df['l'][i]

    ax.scatter(x, y, label=l, s=50, linewidth=0.1, c=c)

ax.legend()

plt.show()

在此处输入图片说明

IIUC you can do it this way: IIUC 你可以这样做:

import matplotlib.pyplot as plt
from matplotlib import colors
import pandas as pd

colorlist = list(colors.ColorConverter.colors.keys())
fig, ax = plt.subplots()
[df.iloc[[i]].plot.scatter('n1', 'n2', ax=ax, s=50, label=l,
                         color=colorlist[i % len(colorlist)])
 for i,l in enumerate(df.l)]

colorlist:颜色列表:

In [223]: colorlist
Out[223]: ['m', 'b', 'g', 'r', 'k', 'y', 'c', 'w']

在此处输入图片说明

PS colorlist[i % len(colorlist)] - should always remain in the list bounds PS colorlist[i % len(colorlist)] - 应始终保持在列表范围内

How about this,这个怎么样,

在此处输入图片说明


Here is the source code,这是源代码,

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib import cm

fig, ax = plt.subplots()

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['a','b','c','d']})

#colors = ['b','r','c','y']
nrof_labels = len(df['l'])
colors = cm.rainbow(np.linspace(0, 1, nrof_labels))     # create a bunch of colors

for i, r in df.iterrows():
    ax.plot(r['n1'], r['n2'], 'o', markersize=10, color=colors[i], linewidth=0.1, label=r['l'])

ax.set_xlim(0.5, 3.5)
ax.set_ylim(0.5, 3.5)
plt.legend(loc='best')

plt.show()

Additionally, if df[l] has repeated elements and if the colors have to be assigned accordingly:此外,如果df[l]具有重复的元素,并且必须相应地分配 colors:

import matplotlib.cm as cm
import matplotlib.colors as colors
import numpy as np
import pandas as pd

fig, ax = plt.subplots(figsize=(8,8))

df = pd.DataFrame({'n1':[1,2,1,3], 'n2':[1,3,2,1], 'l':['b','b','c','d']})

l_unq = df['l'].unique()
colormap = cm.viridis
colorlist = [colors.rgb2hex(colormap(i)) for i in np.linspace(0, 0.9, len(l_unq))]

for i,c in enumerate(colorlist):

    x = df[df.l==l_unq[i]].n1
    y = df[df.l==l_unq[i]].n2
    l = l_unq[i]
    ax.scatter(x, y, label=l, s=50, linewidth=0.1, c=c)

ax.set_xlabel('n1')
ax.set_ylabel('n2')
ax.legend()

plt.show()

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM