散点图中基于文本的颜色 python matplotlib

Text based colors in scatterplot python matplotlib

您好,我正在尝试创建一个散点图,其中每个 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

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

的每个 group/category
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()

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

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)

注:此答案深受启发