Как вручную увеличить интервал между двумя конкретными c полями внутри сгруппированной прямоугольной диаграммы в R? - PullRequest
1 голос
/ 26 мая 2020

Есть ли способ увеличить расстояние между желтым и красным прямоугольниками на этом прямоугольном графике?

set.seed(40)
df <- data.frame(
  Outcome = runif(60), 
  Fruit = rep(1:3, each = 10), 
  Freshness = rep(c(0, 0.5), each = 30), 
  Farm = factor(rep(c("A", "B"), each = 5))
) %>% 
  transform(
  Outcome = Outcome*Fruit+Freshness, 
  Fruit = as.factor(Fruit), 
  Freshness = as.factor(Freshness)
)

ggplot(data = df, aes(Farm, Outcome, col = Freshness, fill = Fruit)) + 
  geom_boxplot() + 
  scale_color_manual(values = c("lightslategrey", "black"), labels = c("Stale", "Fresh")) + 
  scale_fill_manual(values = c("red", "orange", "yellow"), labels = c("Apples", "Oranges", "Bananas"))

enter image description here

Я хочу увеличить расстояние (или сделать промежуток) между группами цветов «Свежесть» внутри каждой группы «Ферма», но не настолько, чтобы поля были разделены так же, как группы «Ферма». То есть, я хочу только увеличить расстояние между желтыми и красными прямоугольниками, чтобы подчеркнуть разницу между группами «свежести».

Группы «Фрукты» все равно сохранят расстояние между прямоугольниками внутри группы. То есть соседние красный, оранжевый и желтый прямоугольники останутся близко друг к другу.

Ответы [ 3 ]

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

Вот вам хак:

Было сделано следующее:

  • создать новый Fruit со значениями за пределами диапазона (в данном случае отрицательными)
  • ограничить ylim положительными значениями, чтобы предотвратить отображение этого нового фрукта на графике
  • легенда выдумки, чтобы не отображать этот фрукт (хотя пространство остается прежним)
  • скрыть фон легенды, чтобы сделать это пустое место в легенде не отображаться. (v0.3.0)
0 голосов
/ 26 мая 2020

В дополнение к ответу dshkol вы можете увеличить интервал между группами, но это своего рода взлом. Сначала вам нужно создать фиктивные данные, которые находятся между фермой A и B (т.е. AA), и построить их. Поскольку на графике нет данных, на графике ничего не будет. Затем вам нужно указать ваши разрывы как A и B, чтобы фиктивный AA не отображался на графике. Вы можете настроить интервал между коробчатыми диаграммами, используя аргумент position_dodge, и изменить интервал между группами, настроив параметр раскрытия. Насколько близко друг к другу будут отображаться блочные диаграммы, также будет зависеть от того, в какой размер изображения вы экспортируете.

# get unique values to set scale_x_discrete labels
farms <- unique(df$Farm)
dfmod <- df

# create dummy row with no data except for Farms
dfmod$Farm <- as.character(dfmod$Farm)
dfmod <- rbind(dfmod, list(NA, NA, NA, 'AA'))


ggplot(data = dfmod, aes(Farm, Outcome, col = Freshness, fill = Fruit)) + 
  geom_boxplot(position=position_dodge(1)) + 
  scale_color_manual(values = c("lightslategrey", "black"), labels = c("Stale", "Fresh")) + 
  scale_fill_manual(values = c("red", "orange", "yellow"), labels = c("Apples", "Oranges", "Bananas")) +
  scale_x_discrete(breaks=farms, expand=c(0,2))

enter image description here

0 голосов
/ 26 мая 2020

Вы можете изменить интервал между полями, добавив position=position_dodge(width =...)) к geom_boxplot() и поиграйте с выбором ширины, пока не получите желаемый результат.

ggplot(data = df, aes(Farm, Outcome, col = Freshness, fill = Fruit)) + 
  geom_boxplot(position=position_dodge(width = 1)) + 
  scale_color_manual(values = c("lightslategrey", "black"), labels = c("Stale", "Fresh")) + 
  scale_fill_manual(values = c("red", "orange", "yellow"), labels = c("Apples", "Oranges", "Bananas"))

Вот оригинал для сравнения. enter image description here И модифицированный (с width=1) enter image description here Увеличение расстояния между категориями по оси X - это другая проблема, и ее сложнее решить. Один простой обходной путь - использовать фасет со свободными масштабами по оси X.

ggplot(data = df, aes(Farm, Outcome, col = Freshness, fill = Fruit)) + 
    geom_boxplot(position=position_dodge(width = 1)) + 
    scale_color_manual(values = c("lightslategrey", "black"), labels = c("Stale", "Fresh")) + 
    scale_fill_manual(values = c("red", "orange", "yellow"), labels = c("Apples", "Oranges", "Bananas")) +
    facet_wrap(~Farm, ncol = 2, scales = "free_x")

enter image description here

...