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

Python 熊猫-每个点具有不同颜色图例的散点图,python,pandas,matplotlib,Python,Pandas,Matplotlib,从以下示例开始: 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) 我得到的是以下散点图: 我现在尝试为四个点中的每一个设置不同的颜色。

从以下示例开始:

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)
我得到的是以下散点图:

我现在尝试为四个点中的每一个设置不同的颜色。我知道我可以在列表中循环一组颜色,例如,4种颜色,如下所示:

colorlist = ['b','r','c','y']
但是,由于我的真实数据集至少包含20个不同的点,我正在寻找一种“颜色生成器”在其中循环


这是源代码

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

以下方法将创建一个与dataframe一样长的颜色列表,然后用每个颜色的标签绘制一个点:

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您可以这样做:

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)]
颜色列表:

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


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

谢谢,我知道这项技术,但由于我的点的长度可能会有所不同,我正在寻找与固定点数无关的更一般的东西。@FabioLamanna,使用
colors=cm.rainbow(np.linspace(0,1,len(d['f']))
生成一组颜色。我刚刚更新了我的答案。请注意,这假设
df.index
范围(len(df))
,情况可能并非如此。改用
df['n1'].iloc[i]
。对于大约有500列和大量行的场景,有什么建议吗?数据也有时间戳。@TheCuriousOne你对大量的行计算出来了吗?我最终得到了一个巨大的传奇…@michael_question_Answer我只是将传奇移到了情节的左侧和底部,例如,-10,-7类似于传奇的位置