Imports and Sample 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
With 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()
替换代码6】有效地将颜色从 "钻石 "映射到 "绘图"。
(请原谅我没有把另一个例子的图片放上来,我觉得2个就够了 :P)
With seaborn
你可以使用seaborn,这是对matplotlib的包装,默认情况下使它看起来更漂亮(相当有意见,我知道:P),但也增加了一些绘图功能。
For this you could use seaborn.lmplot与fit_reg=False(这可以防止它自动做一些回归)。
sns.scatterplot(x='carat', y='price', data=df, hue='color', ec=None) also does the same thing.
选择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)。