【问题标题】:Text based colors in scatterplot python matplotlib [duplicate]散点图python matplotlib中基于文本的颜色[重复]
【发布时间】:2021-01-15 13:51:34
【问题描述】:

您好,我正在尝试创建一个散点图,其中每个 X、Y 变量组合属于特定类别,因此在散点图中我希望每个类别具有不同的颜色。

我能够按照下面的代码实现这一点。但是,如果我在绘图上看到的颜色条上有类别名称而不是数值,它会更有意义。

任何指针将不胜感激。

我知道 seaborn 可能会让它变得更容易,但我特意寻找基于 matplotlib 的解决方案。

import numpy 
import pandas
import matplotlib.pyplot as plt

numpy.random.seed(0)

N = 50
_categories= ['A', 'B', 'C', 'D']

df = pandas.DataFrame({
    'VarX': numpy.random.uniform(low=130, high=200, size=N),
    'VarY': numpy.random.uniform(low=30, high=100, size=N),
    'Category': numpy.random.choice(_categories, size=N)
})

colorMap = {}
k = 0
for i in _categories:
    colorMap[_categories[k]] = k
    k+=1

plt.figure(figsize=(15,5))
plt.scatter(df.VarX, df.VarY, c= df.Category.map(colorMap), cmap='viridis')
plt.colorbar()
plt.show()

这段代码产生

Output

【问题讨论】:

    标签: python pandas matplotlib scatter-plot colorbar


    【解决方案1】:

    首先,我假设您想要一个“离散”颜色图,所以一种方法是:

    n_cat = len(_categories)
    cmap = plt.get_cmap('viridis', n_cat)
    

    这是获取ListedColormap 的便捷函数,即从默认颜色映射“viridis”中采样的每个类别的颜色列表。接下来,您只需将该颜色图传递给散点图,应用颜色条,然后相应地设置刻度:

    plt.scatter(df.VarX, df.VarY, c= df.Category.map(colorMap), cmap=cmap)
    cbar = plt.colorbar()
    tick_locs = (numpy.arange(n_cat) + 0.5)*(n_cat-1)/n_cat
    cbar.set_ticks(tick_locs)
    cbar.set_ticklabels(_categories)
    

    注意:这个答案深受启发 from this answer

    【讨论】:

      【解决方案2】:

      来自here(粘贴在下面)的答案可能就是您想要的。关键可能是使用 groups = df.groupby('label') 之类的东西,然后绘制 df 的每个组/类别。

      import matplotlib.pyplot as plt
      import numpy as np
      import pandas as pd
      np.random.seed(1974)
      
      # Generate Data
      num = 20
      x, y = np.random.random((2, num))
      labels = np.random.choice(['a', 'b', 'c'], num)
      df = pd.DataFrame(dict(x=x, y=y, label=labels))
      
      groups = df.groupby('label')
      
      # Plot
      fig, ax = plt.subplots()
      ax.margins(0.05) # Optional, just adds 5% padding to the autoscaling
      for name, group in groups:
          ax.plot(group.x, group.y, marker='o', linestyle='', ms=12, label=name)
      ax.legend()
      
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-10
        • 2021-04-15
        • 1970-01-01
        • 2011-02-24
        • 2021-07-28
        • 2014-09-10
        相关资源
        最近更新 更多