【问题标题】:pandas - scatter plot with different color legend for each pointpandas - 每个点都有不同颜色图例的散点图
【发布时间】:2019-05-25 18:43:31
【问题描述】:

从下面的例子开始:

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

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    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)] - 应始终保留在列表边界内

    【讨论】:

      【解决方案2】:

      这个怎么样,


      这里是源代码,

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

      【讨论】:

      • 谢谢,我知道这种技术,但由于我的分数可能会有所不同,所以我正在寻找与固定分数无关的更一般的东西。
      • @FabioLamanna,使用colors = cm.rainbow(np.linspace(0, 1, len(d['f']))) 生成一堆颜色。我刚刚更新了我的答案。
      【解决方案3】:

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

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

      【讨论】:

      • 请注意,这里假设df.indexrange(len(df)),但情况可能并非如此。请改用df['n1'].iloc[i]
      • 对于大约 500 列和高行数的场景有什么建议吗?数据也带有时间戳。
      • @TheCuriousOne 您是否为大量行计算出这一点?我最终得到了一个巨大的传奇......
      • @michael_question_answerer 我只是将图例移动到图的左侧和底部,例如,-10,-7 类似于图例的位置
      猜你喜欢
      • 1970-01-01
      • 2019-11-03
      • 2017-07-26
      • 1970-01-01
      • 2020-12-19
      • 2021-12-02
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多