简体   繁体   English

在 ggplot2 中使用 facet_grid() 时如何定义常见的 y 轴限制

[英]How to define common y-axis limits when using facet_grid() in ggplot2

My third post here.我在这里的第三个帖子。 I am leading the plot design using lines and areas in ggplot2 with facet_grid() .我正在使用带有facet_grid()ggplot2中的线条和区域来领导 plot 设计。 The code works well.代码运行良好。 Here is the data I used:这是我使用的数据:

#My data
df <- structure(list(Var = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10", "11", "12"), class = c("ordered", "factor")), Val = c(46.0233614780009, 
85.6471698498353, 83.8100037071854, 98.6977939726785, 94.0682111307979, 
92.1834012959152, 79.1579962009564, 62.9422475816682, 2.36891501117498, 
25.3718703053892, 87.2779565863311, 32.0944497128949, 444.363995105959, 
337.84707041923, 93.2718054391444, 171.342949266545, 81.6757546272129, 
135.7353850035, 286.496924120001, 450.293861329556, 339.913251576945, 
80.7274857070297, 122.17661133036, 370.043645612895), Group = c("Up", 
"Up", "Up", "Up", "Up", "Up", "Up", "Up", "Up", "Up", "Up", "Up", 
"Down", "Down", "Down", "Down", "Down", "Down", "Down", "Down", 
"Down", "Down", "Down", "Down")), row.names = c(NA, -24L), class = "data.frame")

Now this is my plot:现在这是我的 plot:

library(ggplot2)
library(dplyr)
#Code for the plot
df %>%
  mutate(Val=ifelse(Group=='Down',-Val,Val),
         Group=factor(Group,levels = c('Up','Down'),ordered = T)) %>%
  ggplot(aes(x=Var,y=Val,color=Group,fill=Group,group=Group))+
  geom_line(size=1)+geom_area(alpha=0.75)+
  facet_grid(Group~.,scales = 'free')+
  scale_y_continuous(labels = function(x) abs(x),
                     expand = c(0,0.1))+
  scale_fill_manual(values=c('cyan','tomato'))+
  scale_color_manual(values=c('cyan','tomato'))+
  theme_bw()

Which produces this baby:哪个产生了这个婴儿:

在此处输入图像描述

Until here everything is fine.直到这里一切都很好。 I would like if it is possible to modify two elements:我想是否可以修改两个元素:

  1. How can I reduce the vertical space between both facets so that visually there would be only one x-axis (align in the same axis both zeroes and reduce that space).如何减少两个面之间的垂直空间,以便在视觉上只有一个 x 轴(在同一轴上对齐两个零并减少该空间)。

  2. I would like to have the same scale in both y-axis, so the code is designed to have a mirror effect.我想在两个 y 轴上都有相同的比例,所以代码被设计成具有镜像效果。 My issue is that when I set a scale in y-axis like this:我的问题是,当我像这样在 y 轴上设置比例时:

scale_y_continuous(labels = function(x) abs(x),expand = c(0,0.1),limits = c(NA,800))

Everything changes:一切都变了:

在此处输入图像描述

I would like if possible that both y-axis have the same scale starting in 0 to 800 but respecting the magnitude.如果可能的话,我希望两个 y 轴具有相同的比例,从 0 到 800 开始,但尊重幅度。 In this case upper would go from 0 to 800 and down from 0 to -800 but masked according to labels to have the mirror effect.在这种情况下,go 从 0 到 800 向上,从 0 到 -800 向下,但根据标签进行屏蔽以产生镜像效果。

Many thanks for the help.非常感谢您的帮助。

This looks like an ideal job for the old "invisible dots" trick to set the facet limits where you want them:对于旧的“隐形点”技巧来说,这看起来是一个理想的工作,可以在你想要的地方设置分面限制:

library(ggplot2)
library(dplyr)

df %>%
  mutate(Val = ifelse(Group == 'Down', -Val, Val),
         Group = factor(Group, levels = c('Up', 'Down'), ordered = TRUE)) %>%
  ggplot(aes(Var, Val, color = Group, fill = Group, group = Group)) +
  geom_line(size = 1) +
  geom_area(alpha = 0.75) +
  geom_point(data = data.frame(Group = factor(c("Down", "Up"), c('Up', 'Down')),
                               Var = c(1, 1),
                               Val = c(-800, 800)), alpha = 0) +
  facet_grid(Group~., scales = 'free') +
  scale_y_continuous(labels = function(x) abs(x),
                     expand = c(0, 0.1)) +
  scale_fill_manual(values = c('cyan', 'tomato')) +
  scale_color_manual(values = c('cyan', 'tomato')) +
  theme_bw() +
  theme(panel.spacing = unit(0, "points"))

在此处输入图像描述

Though, it's only fair to point out you don't really need facets here and you get a very similar effect by doing:不过,公平地指出您在这里并不真正需要方面,并且您可以通过以下方式获得非常相似的效果:

df %>%
  mutate(Val = ifelse(Group == 'Down', -Val, Val),
         Group = factor(Group, levels = c('Up', 'Down'), ordered = TRUE)) %>%
  ggplot(aes(Var, Val, color = Group, fill = Group, group = Group)) +
  geom_line(size = 1) +
  geom_area(alpha = 0.75) +
  geom_hline(yintercept = 0) +
  scale_y_continuous(labels = function(x) abs(x),
                     expand = c(0, 0.1),
                     limits = c(-800, 800)) +
  scale_fill_manual(values = c('cyan', 'tomato')) +
  scale_color_manual(values = c('cyan', 'tomato')) +
  theme_bw() +
  theme(panel.spacing = unit(0, "points"))

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM