Как раскрасить границу geom_col в ggplot2, чтобы избежать перекрытия? - PullRequest
4 голосов
/ 19 июня 2020

Я хочу покрасить границу гистограммы в ggplot2.

Следующий сценарий является примером.

Как видите, оранжевая граница перекрывается с синей рамкой. Есть ли способ избежать такого поведения и раскрасить границу на графике?


library(tidyverse)
dat <- tibble(
  dx = c("D+","D+","D-","D-"),
  test    = c("T+","T-","T+","T-"),
  num     = c(40,80,100,800)
)

ggplot(dat) +
  geom_col(aes(x = dx, y = num, fill = dx, color = test),
           size = 3) +
  scale_color_manual(values = c("orange","blue"))

enter image description here

Ответы [ 3 ]

3 голосов
/ 19 июня 2020

Проблема в том, что гистограммы построены из grid::rectGrob, и когда вы увеличиваете контур rectGrob, он расширяется. Поскольку линии имеют фиксированный размер, а сами полосы - нет (как вы увидите, если измените размер окна), нет простого способа просто сжать rectGrob s, чтобы компенсировать это, чтобы позволить внутреннее обводку . Таким образом, решить эту проблему сложнее, чем кажется на первый взгляд. Конечно, это не невозможно, но у вас есть три варианта:

  1. Выберите другой способ построения (например, position_dodge)
  2. Достигните желаемого эффекта с помощью временного hack
  3. Напишите совершенно новую геометрию для достижения эффекта (или найдите пакет, который уже сделал это)

Если это всего лишь одноразовая работа, и вы хотите продолжить особенно приглядитесь к вашему сюжету, я бы определенно выбрал go для варианта 2. Вот пример того, как это может быть достигнуто:

ggplot(dat) +
  geom_col(aes(x = dx, y = num, fill = dx, color = test),
           size = 3) +
  scale_color_manual(values = c("orange","blue")) +
  geom_segment(aes(x = 0.53, y = 100, xend = 1.465, yend = 100), 
               size = 3, colour = "blue") +
  geom_segment(aes(x = 0.53, y = 120, xend = 1.465, yend = 120), 
               size = 3, colour = "orange") +
  geom_segment(aes(x = 1.53, y = 40, xend = 2.465, yend = 40), 
               size = 3, colour = "blue") +
  geom_segment(aes(x = 1.53, y = 60, xend = 2.465, yend = 60), 
               size = 3, colour = "orange") 

enter image description here

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

Поскольку у вас уже есть dx по оси x, нет необходимости его раскрашивать или заливать.

ggplot(dat) +
  geom_col(aes(x = dx, y = num, fill = test))

enter image description here

0 голосов
/ 19 июня 2020

Хакерским решением вашей проблемы может быть нанесение полосы поверх существующей. Новый слой будет содержать только одну тестовую группу, и значения этой группы немного уменьшены. Как раз достаточно, чтобы граница не перекрывалась.

dat %>%
  ggplot2::ggplot(ggplot2::aes(x=dx,y=num,fill=dx,color=test)) +
  ggplot2::geom_col(size=1,position=ggplot2::position_dodge(0.93)) +
  ggplot2::scale_color_manual(values=c("blue","orange"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...