1

我制作了这个美妙的条形图(见下文)。为了快速按地区对我的国家/地区进行分组,我添加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)不再适合,但需要对区域敏感。

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

0

你可以有一个region变量并根据它来刻面图。然后,您可以使用构面图间距。

你没有提供数据,所以我做了一个虚拟test数据框。

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))

# 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)])

ggplot(test, aes(x = country, y = value)) + geom_bar(stat = 'identity') + 
  facet_grid(rows = vars(region), scales = "free_y", space = "free_y") + coord_flip() +
  theme(panel.spacing = unit(1, "lines")) # play with this to spread more

这产生

在此处输入图像描述

虽然我在这里按价值排序,但您可以给出您想要的顺序作为您的因素水平。

编辑:与“差距”

我将在这里提出免责声明,我个人认为使用带有轴中断或间隙的图不是一个好主意。 这已经在本网站上进行了广泛的讨论,并且有很多方法可以解决它(例如转换数据、使用对数刻度、构建索引等)。

由于您试图以自己的方式强行使用它,因此我将为您提供另一种解决方法:使用宽度较大的线。

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() +
  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") + coord_flip() +
  theme(panel.spacing = unit(1, "lines")) + # play with this to spread more
  geom_hline(yintercept = trans_surf(50), size = 10, color = "white")

情节的最后一行是我从您的帖子代码中更改的唯一内容。结果,我得到:

在此处输入图像描述

于 2019-12-03T12:33:23.133 回答
0

您应该使用labels而不是limits. b/c 下面的玩具示例您没有提供regrex

解释

limits您一起设置limits规模。由于它是一个离散的尺度,它需要唯一的数据点。但你labels并不是独一无二的。你想要的是设置labels比例,因此你应该使用参数labels

数据

library(tidyverse)
set.seed(1)
my_dat <- mtcars %>% 
    rownames_to_column() %>% 
    as_tibble() %>% 
    select(rowname, mpg) %>% 
    add_row(rowname = paste0("remove", 1:3), mpg = rep(0, 3)) %>% 
    slice(sample(NROW(.))) %>% 
    mutate(rowname = factor(rowname, rowname))

p <- ggplot(my_dat, aes(x=rowname, y = mpg)) + 
   geom_col(position = "dodge", na.rm=F) + 
   coord_flip()

rn <- gsub("^remove[0-9]+", "", my_dat$rowname)

错误的使用方式limits

p + scale_x_discrete(limits = rn)

通过限制的错误方式

正确使用方法labels

p + scale_x_discrete(labels = rn)

正确使用标签的方法

于 2019-12-03T12:35:39.293 回答