在多个绘图的ggplot中更改y轴限制

时间:2019-12-10 15:27:01

标签: r ggplot2

我有以下ggplot:

enter image description here

使用以下脚本生成的

df_long <- melt(df)

ggplot(df_long, aes(x = variable, y = value)) + 
  geom_boxplot() +
  facet_wrap(~variable, scales = 'free', ncol = 6)

我想将y轴的限制更改为从0开始到每个变量的最大值结束,并为所有变量设置相同的间隔。目前,ACND很好,因为它们具有相同的间断(它们的标签甚至对齐),但其他变量不同。对于NVIC,它们的结尾不是最大值,并且与ACND的中断不同。对于PICDBI,它们的中断与ACND的中断不同。在其他问题上,我希望所有y轴对齐并看起来优雅。

您知道如何解决该问题吗?

1 个答案:

答案 0 :(得分:3)

您需要指定y轴的要求,并使用scale_y_continuous语句进行设置。

breaks参数可以是一个从给定数据返回中断的函数,因此您可以设置一个函数,以在其最小值和最大值之间给出一个设置长度的序列。 请注意,这些轴值可能没有多大意义(例如2.09、2.83,...),但是它们在图形上的y位置相同。

所选中断点的值非常不可读,因此我们还可以为labels参数指定一个函数,该函数将中断作为输入并返回四舍五入的标签。

library(ggplot2)
# generate dummy data
set.seed(2)
df <- data.frame(var = sample(LETTERS[1:4], 1000, replace = T),
                 val = abs(rnorm(1000)))
df$val[df$var%in%c("B", "D")] <- df$val[df$var%in%c("B", "D")] / 2 
head(df)


# actual plotting
my_breaks <- function(x){seq(min(x), max(x), length.out = 5)}
my_labels <- function(x){round(x, digits = 2)}

ggplot(df, aes(x=var,y=val)) + geom_boxplot() + facet_wrap(~var, scales = 'free', ncol = 4) +
  scale_y_continuous(breaks = my_breaks, labels = my_labels)

这将输出以下图形

enter image description here

编辑:向轴添加一些约束

如果要将轴限制在特定范围内,则必须使用my_breaks()函数定义。根据您的评论,我将在下面提供一些示例。

  • 在0上启动轴: my_breaks <- function(x){seq(0, max(x), length.out = 5)}
  • 以1或最大值结尾(如果较小): my_breaks <- function(x){seq(min(x), min(1, max(x)), length.out = 5)}

我确定您可以找到满足您需求的具体要求;)