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

2024-09-21 03:26:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here


Tags: importnumpypandasdfsizematplotlibpltrandom
2条回答

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

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

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

相关问题 更多 >

    热门问题