facet_zoom是将焦点放大到不同的x轴值。

3
使用这个数据
df <- read.table(text = c("
Site    measured    simulated
site1   9.1 6.8
                          site2 163.1   128.1
                          site3 126 75.9
                          site4 741.2   843
                          site5 2215.1  1937.7
                          site6 283.6   423.4
                          site7 115.6   92.5
                          site8 12.1    15.3
                          site9 13.4    15.8
                          site10    475.7   296.1
                          site11    1   1.4
                          site12    84.5    131.9
                          site13    74.1    43.9
                          site14    19.2    33.3
                          site15    74.8    41.1
                          site16    287.8   366.9"), header =T)

以下是脚本内容:

library(tidyr) 
library(dplyr)
library(ggplot2)
library(ggforce)
df_reorder <-  transform(df, 
                         Site_reorder = reorder(Site, -measured))
df_long <- df_reorder %>% gather("id", "value", 2:3) 


ggplot(df_long, aes(x = Site_reorder, y = value, fill = id))+
  geom_bar(stat = "identity", position = "dodge", width = 0.7)+
  scale_fill_manual(values=c("red", "black")) + 
  theme_bw()+
  facet_zoom(x = Site_reorder%in%c("site14", "site9", "site8", "site1", "site11"))+
  labs(x = "", y = " ")+
  theme(legend.position = c(0.90, 0.90), legend.background = element_rect(fill="transparent"),
        legend.title = element_blank(), axis.text.x=element_text(angle=55, vjust=1,  hjust=1,size = 8))

我希望缩放的对象是最后五个网站(site14, site9, site8, site1site11),但实际上它缩放到了前五个网站(site5, site4, site10, site16, 和 site6)。

enter image description here

请问有什么建议可以让缩放对象变为最后五个网站吗?


不是一个正确的答案,但尝试将变量x转换为因子。这可能会解决问题... - ThomasP85
@ThomasP85感谢您的时间和建议。在我的原始数据框中,x变量是因子(factor)。然而,我仍然遇到了同样的问题。 - shiny
真遗憾 - 我想我知道问题所在,它与您的x轴的离散性有关。本以为因式分解可以解决它,但似乎我需要再仔细考虑一下。 - ThomasP85
2个回答

8

ggforce 只对连续比例尺进行缩放。

1- 您可以使用 as.numeric 将级别转换为数字,

2- 然后使用 scale_x_continuous 来显示站点名称。

ggplot(df_long, aes(x = as.numeric(Site_reorder), y = value, fill = id))+
  geom_bar(stat = "identity", position = "dodge", width = 0.7)+
  scale_fill_manual(values=c("red", "black")) + 
  theme_bw()+
  facet_zoom(xy = Site_reorder%in%c("site14", "site9", "site8", "site1", "site11"), horizontal=FALSE) + 
  scale_x_continuous(
    breaks = 1:length(levels(df_long$Site_reorder)),
    label = levels(df_long$Site_reorder)
  )+
  labs(x = "", y = " ")+
  theme(legend.position = c(0.90, 0.90), legend.background = element_rect(fill="transparent"),
        legend.title = element_blank(), axis.text.x=element_text(angle=55, vjust=1,  hjust=1,size = 8))

enter image description here


非常感谢您的时间和帮助。当它缩放到最后五个站点时,有没有办法使y轴只从0到100。整个重点不是保持原始y轴,因为这些站点的值非常低。 - shiny
@aelwan 我认为 facet_zoom 的缩小参数应该可以实现这个功能,但看起来它还没有被实现:https://github.com/thomasp85/ggforce/blob/master/R/facet_zoom.R - Chris
@Chris 感谢您的时间和帮助。 - shiny
通过您的好答案,我发现了顶部绘图中所有站点上方的一条线。您有任何想法为什么会出现这条线,并如何去除它吗? - shiny
1
@aelwan 这行是上部的y缩放边界,只需添加参数show.area=FALSE来隐藏它(它也会隐藏垂直的边界)。 - HubertL

0
所有的功劳归功于@HubertL,因为这完全是基于他的解决方案。我将其简化了许多,以便更容易理解。
df_reorder <-  transform(df, Site_reorder = reorder(Site, -measured))
df_long <- df_reorder %>% gather("id", "value", 2:3)

b <- df_long %>% 
  filter(id == "measured") %>% 
  select(-Site, -id) %>% as.tibble()


# b is just a minimal version of df_long
b

b %>% 
  ggplot(aes(x = as.numeric(Site_reorder), y = value)) +
  geom_bar(stat = "identity", width = 0.7) +
  facet_zoom(xy = Site_reorder %in% c("site14", "site9", "site8", "site1", "site11"), horizontal=FALSE) + 
  scale_x_continuous(
    breaks = 1:length(levels(df_long$Site_reorder)),
    label = levels(df_long$Site_reorder)
  )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接