导入和示例 DataFrame
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns # for sample data
from matplotlib.lines import Line2D # for legend handle
# DataFrame used for all options
df = sns.load_dataset('diamonds')
carat cut color clarity depth table price x y z
0 0.23 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43
1 0.21 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31
2 0.23 Good E VS1 56.9 65.0 327 4.05 4.07 2.31
和matplotlib
您可以传递plt.scatter
一个c
参数,该参数允许您选择颜色。以下代码定义了一个colors
字典以将菱形颜色映射到绘图颜色。
fig, ax = plt.subplots(figsize=(6, 6))
colors = {'D':'tab:blue', 'E':'tab:orange', 'F':'tab:green', 'G':'tab:red', 'H':'tab:purple', 'I':'tab:brown', 'J':'tab:pink'}
ax.scatter(df['carat'], df['price'], c=df['color'].map(colors))
# add a legend
handles = [Line2D([0], [0], marker='o', color='w', markerfacecolor=v, label=k, markersize=8) for k, v in colors.items()]
ax.legend(title='color', handles=handles, bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()
df['color'].map(colors)
有效地将颜色从“钻石”映射到“绘图”。
(请原谅我没有放另一个示例图像,我认为 2 就足够了:P)
和seaborn
您可以使用seaborn
which 是一个包装器matplotlib
,使其在默认情况下看起来更漂亮(相当基于意见,我知道:P),但还添加了一些绘图功能。
为此,您可以使用seaborn.lmplot
with fit_reg=False
(这可以防止它自动进行一些回归)。
sns.scatterplot(x='carat', y='price', data=df, hue='color', ec=None)
也做同样的事情。
选择hue='color'
告诉 seaborn 根据'color'
列中的唯一值拆分和绘制数据。
sns.lmplot(x='carat', y='price', data=df, hue='color', fit_reg=False)
如果您不想使用 seaborn,请使用pandas.groupby
单独获取颜色,然后仅使用 matplotlib 绘制它们,但是您必须随时手动分配颜色,我在下面添加了一个示例:
fig, ax = plt.subplots(figsize=(6, 6))
grouped = df.groupby('color')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='carat', y='price', label=key, color=colors[key])
plt.show()
此代码假定与上面相同的 DataFrame,然后根据color
. 然后它遍历这些组,为每个组绘图。为了选择颜色,我创建了一个colors
字典,它可以将钻石颜色(例如D
)映射到真实颜色(例如tab:blue
)。