【问题标题】:How to bar plot each row of a dataframe如何条形图数据框的每一行
【发布时间】:2021-12-31 15:42:18
【问题描述】:

数据框如下:

import pandas as pd
import numpy as np  # used for the nan values

data = {'card_name': ['Diamonds', 'Clovers', 'HorseShoe'], '$20': [1000.0, 10.0, np.nan], '$25': [500.0, np.nan, 1873.0], '$30': [25, 213, 4657], '$40': [np.nan, 2199.0, np.nan], '$50': [1500.0, np.nan, 344.0], '$70': [np.nan, 43.0, 239.0], '$75': [30.0, 2.0, np.nan], '$100': [1.0, np.nan, 748.0]}
df = pd.DataFrame(data)

   card_name   $20  $25  $30  $40  $50   $70   $75  $100
0  Diamonds   1000  500  25   NaN 1500   NaN    30    1
1  Clovers    10    NaN  213 2199  NaN   43     2    NaN
2  HorseShoe  NaN  1873 4657  NaN  344   239   NaN   748

美元符号列名下的数字是对应的card_name上有多少奖品。

我正在尝试绘制每个 card_name 的图表并显示所有列的奖品数量。

我将 Python 和 Pandas 与 Matplotlib/Seaborn 一起使用

【问题讨论】:

    标签: python pandas matplotlib seaborn bar-chart


    【解决方案1】:
    • 所需数据框的形状取决于用于绘图的绘图 API。
      • pandasseaborn 都依赖于 matplotlib,但需要不同的形状才能获得相同的结果。

    pandas

    • 设置'card_name'为索引,然后用.T转置dataframe。
    • 直接使用pandas.DataFrame.plotkind='bar' 绘制数据框。索引被绘制为轴。
    # set the index and transpose
    dft = df.set_index('card_name').T
    
    # display(dft)
    card_name  Diamonds  Clovers  HorseShoe
    $20          1000.0     10.0        NaN
    $25           500.0      NaN     1873.0
    $30            25.0    213.0     4657.0
    $40             NaN   2199.0        NaN
    $50          1500.0      NaN      344.0
    $70             NaN     43.0      239.0
    $75            30.0      2.0        NaN
    $100            1.0      NaN      748.0
    
    # plot
    dft.plot(kind='bar', rot=0)
    

    seaborn

    # convert the dataframe to long format
    dfm = df.melt(id_vars='card_name')
    
    # display(dfm.head())
       card_name variable   value
    0   Diamonds      $20  1000.0
    1    Clovers      $20    10.0
    2  HorseShoe      $20     NaN
    3   Diamonds      $25   500.0
    4    Clovers      $25     NaN
    
    ax = sns.barplot(data=dfm, x='variable', y='value', hue='card_name')
    

    subplots

    pandas

    • 添加参数subplots=True
    # using the previously transformed dataframe dft
    axes = dft.plot(kind='bar', rot=0, subplots=True, figsize=(6, 10))
    

    seaborn

    • 通过指定row= 和/或col= 参数,可以更轻松地使用.catplot 获取子图。
    # using the previously transformed dataframe dfm
    p = sns.catplot(kind='bar', data=dfm, x='variable', y='value', row='card_name', height=3, aspect=1.5)
    

    【讨论】:

    • 如何在所有子图上制作 x 标签并旋转标签?我一直在环顾四周,但找不到这个特定案例的答案。 @特伦顿麦金尼
    • @WilhelmGleiss axes = dft.plot(kind='bar', rot=0, subplots=True, figsize=(6, 10), sharex=False) 和 seaborn for ax in p.axes.flat: ax.tick_params(labelbottom=True)How to add x-axis labels to every plot in a seaborn figure-level plot.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2020-01-09
    • 2019-03-20
    • 2017-10-24
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多