【问题标题】:normalize data and plot as stacked bar plot with python/ pandas使用 python/pandas 将数据标准化并绘制为堆积条形图
【发布时间】:2019-01-15 18:27:37
【问题描述】:

我有以下数据框:

    land_cover  canopy_cat  count  tc_density_cor
0           20           1     56       35.760967
1           20           2     28       35.760967
2           20           3     11       35.760967
3           20           4      9       35.760967
4           20           5      4       35.760967
5           20           6      3       35.760967
6           20           7      3       35.760967
7           20           8      1       35.760967
8           20           9      4       35.760967
9           20          10      6       35.760967
10          20          11      2       35.760967
11          30           1    194       17.408260
12          30           2     86       17.408260
13          30           3     55       17.408260
14          30           4     36       17.408260
15          30           5     21       17.408260
16          30           6     15       17.408260
17          30           7      9       17.408260
18          30           8      6       17.408260
19          30           9     19       17.408260
20          30          10     14       17.408260
21          30          11      9       17.408260
22          40           1    106       17.458283
23          40           2     45       17.458283
24          40           3     19       17.458283
25          40           4     14       17.458283
26          40           5      9       17.458283
27          40           6      8       17.458283
28          40           7      5       17.458283
29          40           8      5       17.458283
30          40           9      8       17.458283
31          40          10     12       17.458283
32          40          11      3       17.458283


我想将我的数据绘制为堆积条形图:
x 轴 = 土地覆盖
y 轴 = 每个 canopy_cat 的计数

我认为枢轴功能是我正在寻找的。但是,在我想将每个 land_cover 相对于“tc_density_cor”的“计数”列标准化之前。
例如,land_cover=20 = 127 的“计数”总和。
127/35.76 = 56/x --> 新值将是:15.76

我怎样才能做到这一点?? :)

【问题讨论】:

  • 我改为输入文字..

标签: python pandas matplotlib plot normalize


【解决方案1】:

我认为你需要:

df['Count Per Canopy Cat'] = (df['count'] * df['tc_density_cor'] / 
                              df.groupby('land_cover')['count'].transform(sum))

df.pivot('land_cover',
         'canopy_cat',
         'Count Per Canopy Cat')\
  .plot.bar(stacked=True, figsize=(15,8))

图表:

【讨论】:

  • 太棒了——两者都很好用!谢谢。另一个问题:我可以根据列调整条形宽度吗?我们称它为“class_size”,每个land_cover 有一个值吗?谢谢!
  • 不使用此方法,width 参数需要从 0 到 1 的浮点数。
  • 是的,该值将介于 0 和 1 之间。假设 land_cover 20 为 0.2,land_cover 30 为 0.8...
【解决方案2】:

IIUC

d = df.set_index(
    ['land_cover', 'canopy_cat']
).pipe(
    lambda d: d['count'].div(d['count'].sum(level=0), axis=0, level=0) * d['tc_density_cor']
).unstack()

d.iloc[:, :5]

canopy_cat          1         2         3         4         5
land_cover                                                   
20          15.768615  7.884308  3.097407  2.534242  1.126330
30           7.278454  3.226531  2.063479  1.350641  0.787874
40           7.908453  3.357362  1.417553  1.044513  0.671472

d.plot.bar(stacked=True)


重构了相同的答案

def normalize(d):
    sums = d['count'].sum(level='land_cover')
    return d['count'].div(sums, axis=0, level='land_cover') * d['tc_density_cor']

d = df.set_index(['land_cover', 'canopy_cat']).pipe(normalize).unstack()

d.plot.bar(stacked=True)

【讨论】:

  • 效果很好。多谢!我还可以根据列调整条形宽度吗?我们称它为“class_size”,每个land_cover 一个值(0 到 1 之间的值)?
猜你喜欢
  • 2016-05-24
  • 2017-02-26
  • 2017-04-11
  • 2018-11-26
  • 2018-09-28
  • 1970-01-01
相关资源
最近更新 更多