ggplot 面积图:分组渲染顺序影响可见性

0 投票
1 回答
716 浏览
提问于 2025-04-18 16:51

我有一个数据框:

     Hour  ENTRIES_hourly_rainy  ENTRIES_hourly_not_rainy  ENTRIES_hourly_total
0      0               3559751                   7248389              10808140
1      1               1606880                   3361780               4968660
2      2                145719                    282413                428132
3      3                 26804                     54543                 81347
4      4                766333                   1672134               2438467
5      5                379272                    800500               1179772
6      6                 59030                    123764                182794
7      7                140758                    242930                383688
8      8               1950224                   3544500               5494724
9      9               3806660                   7234291              11040951
10    10                477959                    837528               1315487
11    11                235289                    410994                646283
12    12               7787028                  15026342              22813370
13    13               3145361                   6265131               9410492
14    14                388437                    776277               1164714
15    15                149688                    297624                447312
16    16               5735102                  11601840              17336942
17    17               4250723                   8442271              12692994
18    18                564774                   1123973               1688747
19    19                290350                    544482                834832
20    20               8302496                  16203000              24505496
21    21               4452747                   8668253              13121000
22    22                418217                    784093               1202310
23    23                115005                    230668                345673

我正在使用ggplot来显示不同的列在y轴上,小时作为x轴。

问题是第一列的数值被隐藏了:

print ggplot(aes(x='Hour',ymin=0,ymax='value',fill='variable'),data = entriesPerHourPerRain) +
 geom_area()+theme_matplotlib()

这里插入图片描述

我可以使用透明度(alpha)来让它们可见:

   print ggplot(aes(x='Hour',ymin=0,ymax='value',fill='variable'),data = entriesPerHourPerRain) +

 geom_area(alpha=0.6)+theme_matplotlib()

这里插入图片描述

但我更希望不使用透明度,能让三个区域都可见。

我尝试改变列的“顺序”(ENTRIES_hourly_total, ENTRIES_hourly_not_rainy, ENTRIES_hourly_rainy),但似乎没有什么变化。

有没有人知道怎么解决这个问题?谢谢!

-------------------更新:-----------------------

根据下面的建议,我尝试在“融化”后反转变量的顺序。

我把小时分成了6组(现在你可以在HourGroupIndex列中看到它们被分组)

这是标准情况:[ENTRIES_hourly_rainy, ENTRIES_hourly_not_rainy, ENTRIES_hourly_total]:

entriesPerHourPerRain = pandas.melt(entriesPerHourPerRain, id_vars=['HourGroupIndex'])

    HourGroupIndex                  variable     value
0                0      ENTRIES_hourly_rainy   5339154
1                1      ENTRIES_hourly_rainy   1345393
2                2      ENTRIES_hourly_rainy   6470132
3                3      ENTRIES_hourly_rainy  11470514
4                4      ENTRIES_hourly_rainy  10840949
5                5      ENTRIES_hourly_rainy  13288465
6                0  ENTRIES_hourly_not_rainy  10947125
7                1  ENTRIES_hourly_not_rainy   2839328
8                2  ENTRIES_hourly_not_rainy  12027313
9                3  ENTRIES_hourly_not_rainy  22365374
10               4  ENTRIES_hourly_not_rainy  21712566
11               5  ENTRIES_hourly_not_rainy  25886014
12               0      ENTRIES_hourly_total  16286279
13               1      ENTRIES_hourly_total   4184721
14               2      ENTRIES_hourly_total  18497445
15               3      ENTRIES_hourly_total  33835888
16               4      ENTRIES_hourly_total  32553515
17               5      ENTRIES_hourly_total  39174479

这是反转后的情况:[ENTRIES_hourly_total, ENTRIES_hourly_rainy, ENTRIES_hourly_not_rainy]:

custom_dict= {'ENTRIES_hourly_rainy':3, 'ENTRIES_hourly_not_rainy':2, 'ENTRIES_hourly_total':1}  
entriesPerHourPerRain['rank'] = entriesPerHourPerRain['variable'].map(custom_dict)    
entriesPerHourPerRain.sort(columns=['rank','HourGroupIndex'],inplace=True)
del entriesPerHourPerRain['rank']
entriesPerHourPerRain=entriesPerHourPerRain.reset_index()
del entriesPerHourPerRain['index']

    HourGroupIndex                  variable     value
0                0      ENTRIES_hourly_total  16286279
1                1      ENTRIES_hourly_total   4184721
2                2      ENTRIES_hourly_total  18497445
3                3      ENTRIES_hourly_total  33835888
4                4      ENTRIES_hourly_total  32553515
5                5      ENTRIES_hourly_total  39174479
6                0  ENTRIES_hourly_not_rainy  10947125
7                1  ENTRIES_hourly_not_rainy   2839328
8                2  ENTRIES_hourly_not_rainy  12027313
9                3  ENTRIES_hourly_not_rainy  22365374
10               4  ENTRIES_hourly_not_rainy  21712566
11               5  ENTRIES_hourly_not_rainy  25886014
12               0      ENTRIES_hourly_rainy   5339154
13               1      ENTRIES_hourly_rainy   1345393
14               2      ENTRIES_hourly_rainy   6470132
15               3      ENTRIES_hourly_rainy  11470514
16               4      ENTRIES_hourly_rainy  10840949
17               5      ENTRIES_hourly_rainy  13288465

但在这两种情况下,我得到的图表还是一样的。

print  ggplot(aes(x='HourGroupIndex',ymin=0,ymax='value',fill='variable'),data = entriesPerHourPerRain) + geom_area(alpha=0.6,position='dodge')+scale_x_continuous(breaks = range(0,6), labels=['0-3','1-7','2-11','3-15','4-19','5-23'])+theme_matplotlib()

看起来顺序并没有太大变化。

这里插入图片描述

1 个回答

0

你的代码看起来像是用Python写的,而不是R,所以这可能没什么帮助。我觉得在Python中,ggplot的默认设置是不同的。(不过你确实标记了这个问题是关于R的。)

在R中:

library(ggplot2)
library(reshape2)
gg <- melt(entriesPerHourPerRain, id="Hour")
ggplot(gg, aes(x=Hour,y=value,fill=variable)) +
  geom_area(position="dodge")

会生成这个:

而这段代码:

gg$variable <- factor(gg$variable, levels=rev(levels(gg$variable)))
ggplot(gg, aes(x=Hour,y=value,fill=variable)) +
  geom_area(position="dodge")

会生成这个:

所以variable是一个因子,原来的级别是按照列的顺序设置的(_rainy, _not_rainy, _total)。这样绘图时,最后一列的值会遮住其他两列的值。那行代码:

gg$variable <- factor(gg$variable, levels=rev(levels(gg$variable)))

会反转因子级别的顺序,所以现在_rainy会被放在最后。

注意position="dodge"的使用。在geom_area(...) [在R中]的默认设置是“堆叠”,这样y值会相加(所以_total的y值会是_rainy + _not_rainy + _total)。看起来你并不想要这个效果。

撰写回答