我有两个相关指标的全球人口数据,并希望在地图上的每个位置绘制迷你条形图。由于每个人口只需要两个条形图,并且它们的比例都相似,因此我打算使用geom_rect()绘制它们。但是,即使宽度相同,两个条形之间的条形宽度也不一致。
这是我为此使用的简化R代码:
library("ggplot2")
theme_set(theme_bw())
library("sf")
library("rnaturalearth")
library("rnaturalearthdata")
library("rgeos")
world <- ne_countries(scale = "medium", returnclass = "sf")
pop_data <- data.frame(long=c(-63,-68,-108,86,64,129,114,174,143,90,64,-21,40,-4,38.7),
lat=c(-23,3,29,51,64,63,32,-41,-4,24,26,64,61,40,39),
measA=c(10,10,10,10,10,10,10,10,10,10,10,10,10,10,10),
measB=c(10,10,10,10,10,10,10,10,10,10,10,10,10,10,10))
ggplot(data = world) +
geom_sf()+
geom_rect(data = pop_data,fill="blue",
aes(xmin = long-2,
xmax = long-1,
ymin = lat,
ymax = lat+measA))+
geom_rect(data = pop_data,fill="red",
aes(xmin = long+1,
xmax = long+2,
ymin = lat,
ymax = lat+measB))+
theme(axis.title.x=element_blank(),axis.title.y=element_blank())
在最终绘图中,条形图的高度将不同,但这只是为了说明宽度差异。谁能解释为什么宽度不同以及如何解决此问题?我也欢迎在地图上制作简单迷你条形图的其他解决方案。我确实看到了其他制作迷你条形图的解决方案,但是其中大多数解决方案都使用了不再起作用的ggplot函数。
我建议您选择一个画一条线并通过size=
来控制宽度的几何图形-这可能会使您看起来更加一致。正如其他人所提到的,尝试用不同的图形输出,因为渲染器jpeg()
,png()
并pdf()
可能会有所不同。这是带有geom_segment()
和的两个示例geom_linerange()
。请注意,为了简化调用并避免重复几何图形,建议将您的pop_data
数据框并收集/熔化/ pivot_longer ...measA
和和measB
列放在一起ggplot()
。您会看到我这样做了geom_linerang()
,但是由于躲避不能与geom_segment一起正常使用,我向您展示了一个没有修改的例子pop_data
。
ggplot(data = world) +
geom_sf() +
geom_segment(
data=pop_data, color='blue',
aes(x= long-1, xend=long-1, y= lat, yend=lat+measA),
size=1.2) +
geom_segment(
data=pop_data, color='red',
aes(x= long+1, xend=long+1, y= lat, yend=lat+measB),
size=1.2) +
theme(axis.title.x=element_blank(),axis.title.y=element_blank())
如前所述,我pop_data
在这里使用dplyr
和进行修改tidyr::gather()
,然后只需调用一次即可geom_linerange()
。我更喜欢此解决方案,但结果非常相似:
pop_data1 <- pop_data %>%
gather('measure', 'pop', -c(long,lat))
ggplot(data = world) +
geom_sf() +
geom_linerange(
data=pop_data1,
aes(x= long, ymin= lat, ymax=lat+pop,
color=measure, group=measure),
size=1.2, position=position_dodge(5)) +
scale_color_manual(values=c('red','blue')) +
theme(axis.title.x=element_blank(),axis.title.y=element_blank())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句