ggplot 面积图:分组渲染顺序影响可见性
我有一个数据框:
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 个回答
你的代码看起来像是用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)。看起来你并不想要这个效果。