使用 ggsubplot 指定绘图顺序
Posted
技术标签:
【中文标题】使用 ggsubplot 指定绘图顺序【英文标题】:Specifying plot order with ggsubplot 【发布时间】:2014-01-08 05:44:01 【问题描述】:我正在使用 ggplot 和 ggsubplot 向地图添加条形图,但无法弄清楚如何指定首先绘制哪个。我想先绘制北方的,这样它们就位于任何重叠的地块后面。使用低填充阿尔法,这些应该仍然是可见的。这是工作流程:
library(ggsubplot)
library(ggplot2)
library(maps)
library(plyr)
world_map = map_data("world")
(p = ggplot() + geom_polygon(data = world_map, aes(x=long, y=lat,group=group)))
d = ddply(world_map,.(region),summarize,long=mean(long),lat=mean(lat))
d = d[sample(1:nrow(d), 50),]
d = rbind(d,d)
d$cat = rep(c('A','B'), each=nrow(d)/2)
d$value = sample(1:10, nrow(d), rep=T)
head(d)
p + geom_subplot(data=d, aes(long, lat, group=region, subplot = geom_bar(aes(cat, value, fill=cat),
col='black', alpha=0.9, stat="identity")), width = 30, height=30)
如您所见,情节顺序似乎很随机。所以我尝试将地区(国家)更改为有序因素:
d$region = factor(d$region, ordered=T)
(ord = count(d[,c('region','lat')], vars=c('region','lat')))
ordered_levels = order(ord$lat, decreasing=T)
print(ord[ordered_levels,])
levels(d$region) = levels(d$region)[ordered_levels]
levels(d$region)
p + geom_subplot(data=d, aes(long, lat, group=region, subplot = geom_bar(aes(cat, value, fill=cat),
col='black', alpha=0.9, stat="identity")), width = 30, height=30)
但这似乎并不能解决问题。非常感谢任何建议。
【问题讨论】:
【参考方案1】:这是你的想法吗?
正如您所指出的,您需要按纬度订购d
,并在对geom_subplot(...)
的调用中使用group=lat
。
set.seed(1)
d = ddply(world_map,.(region),summarize,long=mean(long),lat=mean(lat))
d = d[sample(1:nrow(d), 50),]
d = rbind(d,d)
d$cat = rep(c('A','B'), each=nrow(d)/2)
d$value = sample(1:10, nrow(d), rep=T)
d <- d[order(d$lat),]
head(d)
p + geom_subplot(data=d, aes(long, lat, group=lat,
subplot = geom_bar(aes(cat, value, fill=cat),
col='black', alpha=0.9, stat="identity")), width = 30, height=30)
【讨论】:
感谢 jlhoward。这似乎以某种方式对情节顺序进行了排序。我不确定d <- d[order(d$lat),]
有什么效果——没有它,结果图是一样的。但我认为group=lat
是在正确的轨道上:)
试试aes(...,group=-lat)
。
group=-lat
。天才。 :)【参考方案2】:
在生成的图中,底层地图几乎是一团糟,但这种预购似乎将高纬度项目带到了最前面:
world_map = world_map[order(world_map$lat),]
不清楚您是否希望在靠近赤道的纬度下绘制负纬度,因此您还可以选择使用 abs(world_map$lat) 作为顺序。
【讨论】:
感谢您的回复,虽然我不明白这应该如何工作。如果是关于更改数据顺序,为什么不改用d = d[order(d$lat),]
呢?但无论哪种方式,这些情节对我来说都不是按纬度顺序发生的。一些北边的地块仍然位于南边的地块之上。
我打算让北点总是过度绘制南点。我认为这就是您所要求的,或者更确切地说,我推断它并要求您澄清其意图。我想在 ddply 操作之后订购会更安全。我显然不清楚(未说明的)总体战略。
抱歉有任何歧义 - 就像我说我需要先绘制北方的 :)
啊。不是d <- d[rev(order(d$lat)), ]
还是world_map = world_map[rev(order(world_map$lat)),]
?
似乎 group 参数是决定因素。我没想到会这样!以上是关于使用 ggsubplot 指定绘图顺序的主要内容,如果未能解决你的问题,请参考以下文章
为啥 plotly 条形图在 R 中不按顺序使用我指定的颜色,我如何强制它按顺序使用我的颜色?