ggplot2, перенос фасетов, фиксированный масштаб по оси y для каждой строки, свободный масштаб между строками

Я хотел бы создать график с использованием facet_wrap, который имеет различную шкалу y для каждой строки обертывания. Другими словами, с фиксированными масштабами в одной строке, свободными масштабами в разных строках с фиксированным масштабом x. Бесплатные шкалы не дают мне именно того, что я ищу, как и facet_grid. Если возможно, я бы не хотел создавать 2 отдельных графика, а затем склеивать их вместе. Я ищу результат, подобный графику ниже, но с максимумом шкалы y 300 для первой строки и максимумом шкалы y 50 во второй строке. Спасибо за любую помощь!

Вот мой код:

library(ggplot2)
library(reshape)

# set up data frame
dat <- data.frame(jack = c(150,160,170),
              surgeon = c(155,265,175),
              snapper = c(10,15,12),
              grouper = c(5,12,50))
dat$island<-c("Oahu","Hawaii","Maui")
df<-melt(dat)

# plot
ggplot(df, aes(fill=variable, y=value, x=island)) + 
  geom_bar(width = 0.85, position= position_dodge(width=0.5),stat="identity", colour="black") +
  facet_wrap(~variable, scales = "free_y",ncol=2) + 
  theme_bw() +
  theme(strip.text = element_text(size=15, face="bold"))+
  theme(legend.position="none")+
  theme(panel.grid.major  = element_line(colour = "white", size = 0.2))+
  theme(panel.grid.minor  = element_line(colour = "white", size = 0.5))+
  theme(axis.text.x = element_text(angle = 90, hjust =1, vjust =0.5, size=18))+
  labs(y = expression(paste("Yearly catch (kg)")))

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


person kmccoy    schedule 30.10.2015    source источник
comment
возможно, этот ответ SO поможет вам начать работу.   -  person Eric Fail    schedule 31.10.2015


Ответы (1)


Опираясь на один из ответов с более низким рейтингом из ссылки, прокомментированной Эриком, вы можете добавить слой, который смешивается с фоном, чтобы обеспечить соблюдение топоры.

Здесь я создал второй фрейм данных (df2), который помещает одну точку на «Гавайи» и максимальное значение, которое вы хотите (300 или 50) для четырех типов переменных / рыб. Если вручную установить белый цвет geom_point, он исчезнет с фоном.

library(ggplot2)
library(reshape)

# set up data frame
dat <- data.frame(jack = c(150,160,170),
                  surgeon = c(155,265,175),
                  snapper = c(10,15,12),
                  grouper = c(5,12,50))
dat$island<-c("Oahu","Hawaii","Maui")
df<-melt(dat)
#> Using island as id variables

df2 <- data.frame(island = rep("Hawaii",4), variable = c("jack","surgeon","snapper","grouper"),value = c(300,300,50,50))

ggplot(df, aes(fill=variable, y=value, x=island)) + 
  geom_bar(width = 0.85, position= position_dodge(width=0.5),stat="identity", colour="black") +
  geom_point(data = df2, aes(x = island, y = value), colour = "white") +
  facet_wrap(~variable, scales = "free_y",ncol=2) + 
  theme_bw() +
  theme(strip.text = element_text(size=15, face="bold"))+
  theme(legend.position="none")+
  theme(panel.grid.major  = element_line(colour = "white", size = 0.2))+
  theme(panel.grid.minor  = element_line(colour = "white", size = 0.5))+
  theme(axis.text.x = element_text(angle = 90, hjust =1, vjust =0.5, size=18))+
  labs(y = expression(paste("Yearly catch (kg)")))

person Laura Wiley    schedule 31.10.2015
comment
Обратите внимание, что лучший способ добавить невидимую точку - использовать alpha = 0. Это делает точку полностью прозрачной, поэтому не имеет значения, что находится за точкой. Таким образом, просто замените третью строку графика: geom_point(data = df2, aes(x = island, y = value), alpha = 0) - person Laura Wiley; 31.10.2015
comment
Спасибо, Лаура! Это потрясающе. Теперь я могу перестать биться головой об стену. - person kmccoy; 02.11.2015