我制作了这个美妙的条形图(见下文)。为了快速按地区对我的国家/地区进行分组,我添加scale_x_discrete(limits = ORDER )
了一些空白限制""
(由 指定ORDER
)。它在情节中添加了空条,这对我来说似乎很好用,但axis.ticks
并不一致。我不添加axis.ticks
(我更喜欢),但对于最后一个空栏,它会添加。为什么?如何摆脱这个单一的蜱虫?
ORDER <- c("Kiribati", "Marshall Islands", "Palau", "States of Micronesia",
"",
"Micronesia g." ,
"",
"Fiji", "Nauru", "PNG", "Solomon Islands", "Vanuatu",
"",
"Melanesia g.",
"",
"Cook Islands", "Niue", "Samoa", "Tonga", "Tuvalu",
"",
"Polynesia g."
)
ORDER
ggplot(ESA_coun_p ,aes(x=x, y=y))+
geom_col(position="dodge", na.rm=TRUE)+
scale_x_discrete(limits = ORDER )+
coord_flip()
thothal 和 Romain B. 给出了一些很好的回答来解决这些问题,包括他们的优点和缺点。
@thothal:您的建议使用labels
而不是limits
使绘图保持一致,因为它将轴刻度添加到所有空分隔条。但是,它可能需要对一些空的额外观察和重新排序因素进行硬编码。它也不能很好地区分不同的组。
@Romain B.:您的建议非常有效,并且可以清楚地区分不同的群体。但是,我在使用一些更复杂的图时遇到了困难,即“间隙条图”,它允许在出现异常值的情况下更好地比较值(请参阅下面调整后的示例)。
set.seed(10)
test <- data.frame(country = LETTERS[1:12],
region = c(1,1,1,1,2,2,3,4,4,4,5,5),
value = rnorm(12, m = 10))%>%
mutate(value=replace(value, country=='A', 100))
# I'm ordering by <value> here, so in the plot, they'll be ordered as such
test$country <- factor(test$country, levels = test$country[order(test$value)])
######
trans_rate_surf <- 0.02 ##play around, defines cropping of the cut of values
white_space_min_surf <- 20 ##littel bit above the last fully displaied bar
white_space_max_surf<- 80 ##littel bit below the first cropped bar
#####
trans_surf <- function(x){pmin(x,white_space_min_surf) + trans_rate_surf*pmax(x-white_space_min_surf,0)}
yticks_surf <- c(5, 10, 15, 20, 100) ## not within or too close to the white space
##
test$value_t <- trans_surf(test$value)
ggplot(test, aes(x = country, y = value_t)) + geom_bar(stat = 'identity') + coord_flip()+
geom_rect(aes(xmin=0, xmax=nrow(test)+0.6, ymin=trans_surf(white_space_min_surf), ymax=trans_surf(white_space_max_surf)), fill="white")+
scale_y_continuous(limits=c(0,NA), breaks=trans_surf(yticks_surf), labels=yticks_surf)
如果我现在添加+ facet_grid(rows = vars(region), scales = "free_y", space = "free_y")
一切都搞砸了,因为xmax=nrow(test)
不再适合,但需要对区域敏感。