如何根据单独的熊猫列为条形着色

问题描述

我需要根据数据框的“属性”列绘制条形图并应用颜色

enter image description here

x 轴 = 份额
y 轴 = 价格

fig,ax = plt.subplots()
ax.barh(df['Share'],df['Price'],align='center')
ax.set_xlabel('Shares')
ax.set_ylabel('Price')
ax.set_title('Bar Chart & Colors')
plt.show()

感谢您的帮助!

解决方法

  • 有两种简单的方法可以用不同的颜色为 'Attribute' 绘制条形图
    1. 使用 .pivot 转换数据框,然后使用 pandas.DataFrame.plot 绘制并为水平条形图指定 kind='barh'
      • 使用 kind='bar' 时索引为 x 轴,使用 kind='barh' 时索引为 y 轴
      • 转换后的数据帧的每一列都将用单独的颜色绘制。
      • pandas 使用 matplotlib 作为默认绘图后端。
    2. seaborn.barplothue='Attribute'orient='h' 一起使用。此选项适用于长格式的数据帧,如 OP 中所示。
      • seabornmatplotlib
      • 的高级 API
  • 使用 pandas 1.3.0seaborn 0.11.1matplotlib 3.4.2 进行测试

导入和数据帧

import pandas as pd
import seaborn as sns

# test dataframe
data = {'Price': [110,105,119,102,111,117,110,110],'Share': [110,-50,22,79,29,-2,130,140],'Attribute': ['A','B','C','D','A','C']}
df = pd.DataFrame(data)

   Price  Share Attribute
0    110    110         A
1    105    -50         B
2    119     22         C
3    102     79         D
4    111     29         A
5    117     -2         B
6    110    130         B
7    110    140         C

pandas.DataFrame.plot

# transform the dataframe with .pivot
dfp = df.pivot(index='Price',columns='Attribute',values='Share')

Attribute      A      B      C     D
Price                               
102          NaN    NaN    NaN  79.0
105          NaN  -50.0    NaN   NaN
110        110.0  130.0  140.0   NaN
111         29.0    NaN    NaN   NaN
117          NaN   -2.0    NaN   NaN
119          NaN    NaN   22.0   NaN

# plot
ax = dfp.plot(kind='barh',title='Bar Chart of Colors',figsize=(6,4))
ax.set(xlabel='Shares')
ax.legend(title='Attribute',bbox_to_anchor=(1,1),loc='upper left')
ax.grid(axis='x')

enter image description here

  • stacked=True
ax = dfp.plot(kind='barh',stacked=True,4))

enter image description here

seaborn.barplot

  • 请注意,与之前的绘图相比,y 轴值的顺序颠倒了
ax = sns.barplot(data=df,x='Share',y='Price',hue='Attribute',orient='h')
ax.set(xlabel='Shares',title='Bar Chart of Colors')
ax.legend(title='Attribute',loc='upper left')
ax.grid(axis='x')

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...