python 条形图中颜色重叠

cld4siwp  于 2023-02-11  发布在  Python
关注(0)|答案(2)|浏览(252)

我尝试使用不同的颜色表示iris数据集条形图中不同种类的物种,但所有颜色在图表The bar graph的每个条形上都重叠
我用这个密码

fig,axes=plt.subplots(2,2,figsize=(8,8))
c=['red','green','orange']
axes[0,0].set_title('Sepal Length')
axes[0,0].bar(df['Species'],df['SepalLengthCm'],color=c)
axes[0,1].set_title('Sepal Width')
axes[0,1].bar(df['Species'],df['SepalWidthCm'],color=c)
axes[1,0].set_title('Petal Length')
axes[1,0].bar(df['Species'],df['PetalLengthCm'],color=c)
axes[1,1].set_title('Petal Width')
axes[1,1].bar(df['Species'],df['PetalWidthCm'],color=c)
plt.show()
mnemlml8

mnemlml81#

下面的代码试图解释你的原始代码中发生了什么,为了避免过度拥挤,它使用了虹膜数据集的30个随机行。
df['species']是种类列,包含值['versicolor', 'setosa', 'setosa', 'virginica', 'versicolor', 'versicolor', 'setosa', 'virginica', 'setosa', 'virginica', ...]
df['sepal_length']包含[6.4, 5.5, 4.7, 6.7, 5.8, 5.6, 4.8, 7.1, 5.8, 6.7, ...]
然后ax.bar(df['species'], df['sepal_length'], color=c)将创建30(在此示例中)条。一个用于df['species']versicolor中的第一个,高度为6.4。然后一个用于setosa,高度为5.5。然后再次用于setosa,高度为4.7。由于使用了相同的x值,这条会被画在另一条的上面。2颜色不会与物种相对应,它们只是在每一行重复的3种颜色。
使用索引来定位条形图,然后根据物种来想象所有这些条形图的叠加,这样看起来会更容易。

import seaborn as sns # easy way to get the iris dataset
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(20230210)
fig, axs = plt.subplots(ncols=2, squeeze=False, figsize=(15, 4), gridspec_kw={'width_ratios': [10, 1]})
iris = sns.load_dataset('iris')
df = iris.iloc[np.random.choice(len(iris), replace=False, size=30)].reset_index()
c = ['red', 'green', 'orange']
axs[0, 0].bar(df.index, df['sepal_length'], color=c)
axs[0, 0].margins(x=0.02)
axs[0, 0].set_xticks(df.index, df['species'], rotation=30)
axs[0, 0].set_title('The separate bars drawn')
axs[0, 1].bar(df['species'], df['sepal_length'], color=c)
axs[0, 1].tick_params(axis='x', rotation=30)
axs[0, 1].set_title('Bars superimposed\nper species')

plt.tight_layout()
plt.show()

zysjyyx4

zysjyyx42#

正如@JohanC在评论中所建议的那样,我建议使用Seaborn barplot,但如果您只想使用Matplotlib,您可以执行以下操作(注意,这里假设您希望在每种情况下绘制平均值):

fig, axes = plt.subplots(2, 2, figsize=(8, 8))
c = ['red', 'green', 'orange']

cols = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']

for ax, col in zip(axes.flatten(), cols):
    ax.bar(
        df["Species"].unique(),
        df.groupby("Species")[col].mean(),  # get the mean values
        color=c
    )
    ax.set_title(col)

默认情况下,Seaborn barplot会计算平均值,并根据数据的标准差添加误差线。这可以在Matplotlib中使用以下命令完成:

for ax, col in zip(axes.flatten(), cols):
    ax.bar(
        df["Species"].unique(),
        df.groupby("Species")[col].mean(),  # get the mean values
        yerr=df.groupby("Species")[col].std(), # add error
        color=c,
    )
    ax.set_title(col)

相关问题