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

我有这个数据框是由像(carat, price, color)variables组成的(carat, price, color)我想绘制一个price的散点图carat每种color ,这意味着不同的color有不同的颜色在情节。

ggplotR很容易:

 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) 

在这里输入图像说明

我不知道如何在Python中使用matplotlib

PS:

我知道辅助绘图软件包,比如ggplot for python seabornggplot for python ,我不喜欢它们,只是想知道是否可以单独使用matplotlib来完成这个工作; P

你可以通过plt.scatter一个c参数来让你select颜色。 下面的代码定义了一个colors字典来将您的钻石颜色映射到绘图颜色。

 import matplotlib.pyplot as plt import pandas as pd carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30] price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600] color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',] df = pd.DataFrame(dict(carat=carat, price=price, color=color)) fig, ax = plt.subplots() colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'} ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x])) plt.show() 

df['color'].apply(lambda x: colors[x])将颜色从“diamond”有效地映射到“plotting”。

(请原谅我不把另一个例子的图片,我认为2就足够了:P)

seaborn

你可以使用seaborn ,它是matplotlib一个包装器,默认情况下它看起来更漂亮(而不是基于观点的,我知道:P),但是也增加了一些绘图function。

为此,您可以使用seaborn.lmplot fit_reg=False (防止自动进行回归)的fit_reg=False

下面的代码使用一个示例数据集。 通过selecthue='color'您可以告诉seaborn根据您的颜色分割您的数据框,然后绘制每个数据框。

 import matplotlib.pyplot as plt import seaborn as sns import pandas as pd carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30] price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600] color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',] df = pd.DataFrame(dict(carat=carat, price=price, color=color)) sns.lmplot('carat', 'price', data=df, hue='color', fit_reg=False) plt.show() 

在这里输入图像说明

没有seaborn使用pandas.groupby

如果你不想使用seaborn,那么你可以使用pandas.groupby单独获取颜色,然后使用matplotlib绘制它们,但是你必须手动指定颜色,我已经在下面添加了一个例子:

 fig, ax = plt.subplots() colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'} 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对其进行分组。 然后它重复这些组,为每一个绘制。 要select一种颜色,我已经创build了一个colors字典,可以将钻石颜色(例如D )映射为真实颜色(例如red )。

在这里输入图像说明

这是一个简洁和通用的解决scheme,使用seaborn调色板。

首先find你喜欢的调色板 ,并有select地将其可视化:

 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)) 

这里是matplotlib定性色彩图的标记和颜色的组合:

 import itertools import numpy as np from matplotlib import markers import matplotlib.pyplot as plt m_styles = markers.MarkerStyle.markers N = 60 colormap = plt.cm.Dark2.colors # Qualitative colormap for i,(marker,color) in zip(range(N),itertools.product(m_styles, colormap)): plt.scatter(*np.random.random(2), color=color,marker=marker,label=i) plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=4); 

在这里输入图像说明

使用Altair 。

 from altair import * import pandas as pd df = datasets.load_dataset('iris') Chart(df).mark_point().encode(x='petalLength',y='sepalLength', color='species') 

在这里输入图像说明