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

问题描述

在这里的第三篇文章。我在 ggplot2facet_grid() 中使用线条和区域引导情节设计。该代码运行良好。这是我使用的数据:

#My data
df <- structure(list(Var = structure(c(1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L,1L,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","Down","Down")),row.names = c(NA,-24L),class = "data.frame")

在这是我的情节:

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

生下这个孩子:

enter image description here

直到这里一切都很好。我想是否可以修改两个元素:

  1. 如何减少两个面之间的垂直空间,以便在视觉上只有一个 x 轴(在同一轴上对齐两个零并减少该空间)。

  2. 我希望在两个 y 轴上具有相同的比例,因此代码被设计为具有镜像效果。我的问题是,当我像这样在 y 轴上设置比例时:

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

一切都变了:

enter image description here

如果可能的话,我希望两个 y 轴都具有相同的比例,从 0 到 800,但要考虑幅度。在这种情况下,upper 将从 0 到 800,从 0 到 -800,但根据标签进行屏蔽以具有镜像效果

非常感谢您的帮助。

解决方法

对于旧的“隐形点”技巧来说,这看起来是一个理想的工作,可以在您想要的地方设置构面限制:

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

enter image description here

不过,公平地指出您在这里并不真正需要分面,并且通过执行以下操作可以获得非常相似的效果:

df %>%
  mutate(Val = ifelse(Group == 'Down',group = Group)) +
  geom_line(size = 1) +
  geom_area(alpha = 0.75) +
  geom_hline(yintercept = 0) +
  scale_y_continuous(labels = function(x) abs(x),0.1),limits = c(-800,800)) +
  scale_fill_manual(values = c('cyan',"points"))

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...