pandas 熊猫 - 每个点具有不同颜色图例的散点图

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37812325/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 01:23:19  来源:igfitidea点击:

pandas - scatter plot with different color legend for each point

pythonpandasmatplotlib

提问by Fabio Lamanna

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:

我得到的是以下散点图:

enter image description here

在此处输入图片说明

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 种颜色,例如:

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 个不同的点,我一直在寻找一种“颜色生成器”来在其中循环。

回答by tmdavison

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()

enter image description here

在此处输入图片说明

回答by SparkAndShine

How about this,

这个怎么样,

enter image description here

在此处输入图片说明



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()

回答by MaxU

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']

enter image description here

在此处输入图片说明

PS colorlist[i % len(colorlist)]- should always remain in the list bounds

PS colorlist[i % len(colorlist)]- 应始终保持在列表范围内