Как правильно формировать графики ggplot, не обрезая важные части графика? - PullRequest
2 голосов
/ 20 июня 2020

Я создал гистограмму, используя ggplot() + geom_bar() функции, с помощью пакета ggplot2. Я также использовал coord_flip(), чтобы изменить ориентацию полосок, и geom_text(), чтобы добавить значения вверху каждой полосы. Некоторые полосы имеют разные цвета, поэтому после графика есть легенда. В результате я получаю изображение, наполовину занятое графиком, наполовину - легендой, а значения поверх самых длинных полос обрезаются из-за небольшого размера графика.

Есть идеи, как увеличить размер графика и уменьшить размер легенды, чтобы значения столбцов не обрезались?

Спасибо

Это мой код для воображаемых данных:

labels <- c("A","B","C","D","E")
freq <- c(10.3678, 5.84554, 1.5673, 2.313, 7.111)

df <- as.data.frame(cbind(labels,freq))

type <- c("rich","poor","poor","poor","rich")

library(ggplot2)
ggplot(df, aes(x = reorder(labels,freq), y= freq, fill = type)) +
  geom_bar(stat = "identity", alpha = 1, width = 0.9)+
  coord_flip()+  
  xlab("")+
  ylab("Mean frequency")+
  scale_fill_manual(name = "Type", values = c("red", "blue")) +
  ggtitle("Mean frequency of different labels")+
  geom_text(label = sort(freq, decreasing = FALSE), size = 3.5, hjust = -0.2)

И вот график, который он дает в результате: enter image description here

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Для этого есть несколько исправлений:

Измените ваши ограничения

Как указано @ Dave2e - см. Его ответ

Измените размер вашего вывода

Интересная особенность графики в R заключается в том, что соотношение сторон и разрешение графического устройства изменят результат и внешний вид графика. Когда я запустил ваш код ... отсечения не наблюдалось. Вы можете проверить это, создав сюжет, а затем сохраняя его по-другому. Если я возьму ваш код по умолчанию, вот что я получу с разными аргументами для width= и height= для ggsave() в виде png:

ggsave('a1.png', width=10, height=5)

enter image description here

ggsave('a2.png', width=15, height=5)

enter image description here

Установить расширение

Третий способ - установить расширение до пределов шкалы. По умолчанию ggplot2 фактически добавляет некоторые «отступы» к концам шкалы. Итак, если вы установите свои пределы от 0 до 10, у вас действительно будет область графика, которая немного выходит за это (по умолчанию около 5%). Вы можете переопределить этот параметр, используя аргумент expand= команд scale_... в ggplot. Таким образом, вы можете установить этот предел, например, в следующем коде:

labels <- c("A","B","C","D","E")
freq <- c(10.3678, 5.84554, 1.5673, 2.313, 7.111)
type <- c("rich","poor","poor","poor","rich")
df <- data.frame(labels, freq, type)

library(ggplot2)
ggplot(df, aes(x = reorder(labels,freq), y= freq, fill = type)) +
  geom_bar(stat = "identity", alpha = 1, width = 0.9)+
  coord_flip()+  
  xlab("")+
  ylab("Mean frequency")+
  scale_fill_manual(name = "Type", values = c("red", "blue")) +
  ggtitle("Mean frequency of different labels")+
  geom_text(label = freq, size = 3.5, hjust = -0.2) +
  scale_y_continuous(expand=expansion(mult=c(0,0.15)))

enter image description here

Вы можете определить нижнее и верхнее расширение для оси, поэтому в приведенном выше коде я решил не устанавливать расширение до нижнего предела шкалы y и использовать множитель 0,15 (около 15%) для верхнего предела. По-моему, по умолчанию 0,05 (или 5%).

1 голос
/ 20 июня 2020

Вы можете переопределить ограничения по умолчанию на шкале оси Y с помощью функции ylim().

labels <- c("A","B","C","D","E")
freq <- c(10.3678, 5.84554, 1.5673, 2.313, 7.111)
type <- c("rich","poor","poor","poor","rich")
df <- data.frame(labels, freq, type)

#set the max y axis limit to allow enough room for the label
ylimitmax <- 11

library(ggplot2)
ggplot(df, aes(x = reorder(labels,freq), y= freq, fill = type)) +
   geom_bar(stat = "identity", alpha = 1, width = 0.9)+
   coord_flip()+  
   xlab("")+
   ylab("Mean frequency")+
   scale_fill_manual(name = "Type", values = c("red", "blue")) +
   ggtitle("Mean frequency of different labels")+
   ylim(0, ylimitmax) +
   geom_text(label = freq, size = 3.5, hjust = -0.2)

Скрипт показывает, как кодировать ручные ограничения, но вы можете автоматизировать расчет лимита с помощью что-то вроде ylimitmax= max(freq) * 1.2.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...