在scales =“ free_y”时将度量单位保持在facet_wrap中吗?

时间:2019-01-04 13:31:04

标签: r ggplot2 facet-wrap facet-grid

我正在尝试创建一个facet_wrap(),其度量单位在不同图上保持相同,同时允许在y轴上滑动。

为了澄清,我已经创建了一个数据集df

library(tidyverse)

df <- tibble(
  Year = c(2010,2011,2012,2010,2011,2012),
  Category=c("A","A","A","B","B","B"),
  Value=c(1.50, 1.70, 1.60, 4.50, 4.60, 4.55)
)

使用df,我们可以使用facet_wrap创建以下图:

ggplot(data = df, aes(x=Year, y=Value)) + geom_line() + facet_wrap(.~ Category)

图1 Plot1

要弄清楚两个图之间的差异,可以使用scale = "free_y"

ggplot(data = df, aes(x=Year, y=Value)) + geom_line() 
 + facet_wrap(.~ Category, scale="free_y")

图2 Plot 2

尽管更清楚,但是在图A中y轴上的比例等于0.025,而在B中是0.0125。这可能会误导那些彼此比较AB的人。

所以我现在的问题是要知道是否存在一种优雅的方式来绘制类似下图的图形(y-scale = 0.025)而不必将两个单独的图绘制到网格中?

谢谢

所需结果: enter image description here 网格代码:

# Grid
## Plot A
df_A <- df %>%
  filter(Category == "A") 
plot_A <- ggplot(data = df_A, aes(x=Year, y=Value)) + geom_line() +  coord_cartesian(ylim = c(1.5,1.7)) + ggtitle("A")

## Plot B
df_B <- df %>%
  filter(Category == "B") 
plot_B <- ggplot(data = df_B, aes(x=Year, y=Value)) + geom_line()  + coord_cartesian(ylim = c(4.4,4.6)) + ggtitle("B")

grid.arrange(plot_A, plot_B, nrow=1)

1 个答案:

答案 0 :(得分:1)

根据Setting individual y axis limits with facet wrap NOT with scales free_y上的信息,您可以使用geom_blank()并通过Category手动指定y限制:

# df from above code
df2 <- tibble(
  Category = c("A", "B"),
  y_min = c(1.5, 4.4),
  y_max = c(1.7, 4.6)
)

df <- full_join(df, df2, by = "Category")

ggplot(data = df, aes(x=Year, y=Value)) + geom_line() + 
  facet_wrap(.~ Category, scales = "free_y") +
  geom_blank(aes(y = y_min)) +
  geom_blank(aes(y = y_max))

ggplot2 figure with scales going from 1.5 to 1.7 for A and 4.4 to 4.6 for B