Добавление символа "//" на оси x для удаления пробелов с одной стороны графика панели ggplot - PullRequest
1 голос
/ 06 мая 2020

Я надеюсь, есть ли способ удалить пробелы на одной стороне графика панели (созданного facet_wrap), добавив «//» на оси x. Ниже приведены примерные данные и код:

df <- data.frame(
  condition = c("cond1","cond2","cond3"),
  measure   = c("type1","type2"),
  value     = rep(NA, 6)
  )

# all type 1 measure values are between -0.5 and 0.5
# all type 2 measure values are between 0.5 and 2
df[df$measure=="type1",]$value <- runif(3, min=-0.5, max=0.5)
df[df$measure=="type2",]$value <- runif(3, min= 1.5, max=2.0)

# both panels should have same axis tick intervals
custom_breaks = function(x){
  seq(round(min(x), 2), round(max(x), 2), 0.2)
}

# create a panel plot with vertical line at y=0 for both panels
ggplot(df, aes(x=condition, y=value, color=measure)) +
  geom_point() +
  geom_hline(aes(yintercept=0), color="grey") + 
  scale_y_continuous(breaks=custom_breaks) +
  facet_wrap(~measure, scales="free_x") +
  coord_flip() +
  theme_bw() +
  theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank())

Этот код возвращает график ниже:

enter image description here

Поскольку значения для типа 2 (правая панель) далеки от нуля, добавление вертикальной линии при y = 0 приводит к появлению большого количества пробелов. Мне интересно, есть ли способ поставить "//" на оси x на правой панели после 0 и перейти прямо к 1,5, чтобы не было тонны пустого пустого пространства. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Ваш scales = "free_x" работает нормально - проблема в том, что ваш geom_hline, помещающий строку в 0, включен в оба аспекта. Вот способ включить его только в первый аспект.

ggplot(df, aes(x=condition, y=value, color=measure)) +
  geom_point() +
  geom_hline(data = data.frame(measure = "type1"), aes(yintercept=0), color="grey") + 
  scale_y_continuous(breaks=custom_breaks) +
  facet_wrap(~measure, scales="free_x") +
  coord_flip() +
  theme_bw() + 
  theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank())  

enter image description here

1 голос
/ 07 мая 2020

Сломанные оси обычно не приветствуются, потому что они могут привести к вводящей в заблуждение визуализации, поэтому это намеренно не реализовано в ggplot2 (как ответил сам Хэдли Уикхэм ). Мои предпочтительные решения для чего-то вроде этого: (а) фасетирование (что вы уже делаете) или (б) преобразование логарифма оси - но только если это имеет смысл для заданных данных.

Возьмите эту гистограмму для пример ( источник / ссылка на изображение ): Поскольку в выбросах (красный кружок и стрелки) содержится ценная информация, как преобразование журнала, так и сломанные оси исказят представление реальности. В пакете library(ggforce) есть реализация для таких граней увеличения с помощью функции facet_zoom().

...