使用 matplotlib 为不同的分类级别绘制不同的颜色

新手上路,请多包涵

I have this data frame diamonds which is composed of variables like (carat, price, color) , and I want to draw a scatter plot of price to carat 对于每个 color ,这意味着不同的 color 在图中具有不同的颜色。

这在 Rggplot 中很容易:

 ggplot(aes(x=carat, y=price, color=color),  #by setting color=color, ggplot automatically draw in different colors
       data=diamonds) + geom_point(stat='summary', fun.y=median)

在此处输入图像描述

我想知道如何使用 matplotlib 在 Python 中完成此操作?

附言:

我知道辅助绘图包,例如 seabornggplot for python ,我不喜欢它们,只是想知道是否可以使用 matplotlib 单独,;P

原文由 avocado 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 512
2 个回答

导入和示例 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 它是 matplotlib 的包装器,默认情况下它看起来更漂亮(我知道,而是基于意见:P),但也添加了一些绘图功能。

为此,您可以使用 seaborn.lmplotfit_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)

在此处输入图像描述

随着 pandas.DataFrame.groupby & pandas.DataFrame.plot

如果您不想使用 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 ).

在此处输入图像描述

原文由 Ffisegydd 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是使用 seaborn 调色板的简洁通用解决方案。

首先 找到您喜欢的调色板,并可选择将其可视化:

 sns.palplot(sns.color_palette("Set2", 8))

然后你可以将它与 matplotlib 一起使用—这样做:

 # Unique category labels: 'D', 'F', 'G', ...
color_labels = df['color'].unique()

# List of RGB triplets
rgb_values = sns.color_palette("Set2", 8)

# Map label to RGB
color_map = dict(zip(color_labels, rgb_values))

# Finally use the mapped values
plt.scatter(df['carat'], df['price'], c=df['color'].map(color_map))

原文由 Rems 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题