散点图中基于文本的颜色 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)
注:此答案深受启发
您好,我正在尝试创建一个散点图,其中每个 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.
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)
注:此答案深受启发