使用 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 &lt;- 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 &lt;- d[rev(order(d$lat)), ] 还是world_map = world_map[rev(order(world_map$lat)),] 似乎 group 参数是决定因素。我没想到会这样!

以上是关于使用 ggsubplot 指定绘图顺序的主要内容,如果未能解决你的问题,请参考以下文章

为啥 plotly 条形图在 R 中不按顺序使用我指定的颜色,我如何强制它按顺序使用我的颜色?

在使用 corrr 绘图之前指定相关强度

使用 seaborn 绘图时,如何为色调参数指定多个变量?

如何在绘图中指定字体大小(用于 PDF 输出)?

openGL之API学习(一八零)POINTS LINES TRIANGLES QUADS 绘图顺序规则

如何设置图例中的项目并使用数据框条形图进行绘图