使用 Plotnine 按排序顺序绘图

Plotting in sorted order using Plotnine

我有一个要绘制的数据框。我希望数据点在我的绘图中沿 x 轴按排序顺序显示。在将数据框传递给 ggplot 之前,我曾尝试对其进行排序,但是我的订单被忽略了。我的数据如下,我想在'value'属性上排序

       var1     var2  value     direction
0      PM25     PBAR  0.012001          1
1      PM25  DELTA_T  0.091262          1
2      PM25       RH  0.105857          1
3      PM25      WDV  0.119452          0
4      PM25     T10M  0.119506          0
5      PM25      T2M  0.129869          0
6      PM25     SRAD  0.134718          0
7      PM25      WSA  0.169000          0
8      PM25      WSM  0.174202          0
9      PM25      WSV  0.181596          0
10     PM25      SGT  0.263590          1

这是我的代码目前的样子:

tix = np.linspace(0,.3,10)
corr = corr.sort_values(by='value').reset_index(drop = True)
p = ggplot(data = corr, mapping = aes(x='var2', y='value')) +\
  geom_point(mapping = aes(fill = 'direction')) + ylab('Correlation') + ggtitle('Correlation to PM25') +\
  theme_classic() +  scale_y_continuous(breaks = tix, limits = [0, .3])

print(p)

这会产生以下情节:

1

您可以通过两种方式完成

  1. 确保映射到 x 轴的变量是分类变量并且类别排序正确。下面我使用 pd.unique returns 值按出现顺序排列的事实。
corr.sort_values(by='value').reset_index(drop = True)
corr['var2'] = pd.Categorical(corr.var2, categories=pd.unique(corr.var2))
...
  1. Plotnine 有一个内部函数 reorder(在 v0.7.0 中引入),您可以在 aes() 调用中使用它来根据另一个变量的值更改一个变量值的顺序.请参阅页面底部 reorder 的文档。
# no need to sort values
p = ggplot(data = corr, mapping = aes(x='reorder(var2, value)', y='value')) +\
...

我无法让 reorder() 工作,但我能够使用 scale_x_discrete() 来控制顺序。参见