facet_zoom увеличивает различные значения оси X

Используя это

ДАННЫЕ

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, site1 а также site11). Вместо этого он увеличился в первые пять сайтов (site5, site4, site10, site16, а также site6)

введите описание изображения здесь

Будут оценены какие-либо предложения, как сделать увеличение для последних пяти сайтов?

1 ответ

Решение

ggforce только масштаб в непрерывном масштабе.

1- Вы можете использовать as.numeric преобразовать уровни в числовые,

2- затем используйте scale_x_continous печатать названия сайтов

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

Вся заслуга принадлежит @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)
  )
Другие вопросы по тегам