Как сделать наложение цвета между полосой ошибок и полосой на гистограмме?

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

library(ggplot2)
library(tibble)

my_df <- 
  tibble::tribble(~response, ~estimate, ~lower_ci, ~upper_ci,
                  "little_bit", 0.353477, 0.255625, 0.451747,
                  "no", 0.307639, 0.250436, 0.375393,
                  "very", 0.338883, 0.301007, 0.37572310)

## compare this:
ggplot(my_df, aes(x = reorder(response, -estimate), y = estimate)) +
  geom_bar(stat = "identity", width = 0.9, fill = "#6EB3FF") +
  geom_errorbar(aes(ymin = lower_ci, ymax = upper_ci),
                width = 0.1, size = 3.5)

## with this:
ggplot(my_df, aes(x = reorder(response, -estimate), y = estimate)) +
  geom_bar(stat = "identity", width = 0.9, fill = "#6EB3FF") +
  geom_errorbar(aes(ymin = lower_ci, ymax = upper_ci),
                width = 0.1, size = 3.5, color = "#6EB3FF")


Моя визуальная идея состоит в том, чтобы использовать наложение



Есть ли способ добиться такого наложения с помощью ggplot?

Вы можете использовать alpha, чтобы установить непрозрачность, например. добавьте alpha = .7 к своим геометриям.

stefan 22.12.2020 09:00

@stefan, могу я установить alpha вместо geom_errorbar(), а не geom_bar()?

Emman 22.12.2020 09:44

@Emman Это мало что даст, если сначала не изменить яркость цвета (см. Мой ответ). Или вы добавляете альфу к обоим.

tjebo 22.12.2020 09:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
410
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Подойдет простой альфа.

Обратите внимание, что у вас технически разные цвета. Другой вариант — использовать пакеты для изменения цвета, такие как shades или colorspaces. См. один вариант с colorspaces ниже. shades это круто, когда вы хотите изменить целые палитры.

library(ggplot2)
library(tibble)

my_df <- 
  tibble::tribble(~response, ~estimate, ~lower_ci, ~upper_ci,
                  "little_bit", 0.353477, 0.255625, 0.451747,
                  "no", 0.307639, 0.250436, 0.375393,
                  "very", 0.338883, 0.301007, 0.37572310)

# super easy, just make the bars mor transparent - not quite your desired look
ggplot(my_df, aes(x = reorder(response, -estimate), y = estimate)) +
  geom_bar(stat = "identity", width = 0.9, fill = "#6EB3FF", alpha  = 0.7) +
  geom_errorbar(aes(ymin = lower_ci, ymax = upper_ci),
                width = 0.1, size = 3.5,color = "#6EB3FF")


## darkening the color, and adding some alpha for your desired effect
ggplot(my_df, aes(x = reorder(response, -estimate), y = estimate)) +
  geom_bar(stat = "identity", width = 0.9, fill = "#6EB3FF") +
  geom_errorbar(aes(ymin = lower_ci, ymax = upper_ci),
                width = 0.1, size = 3.5, 
                color = colorspace::darken("#6EB3FF"), alpha  = 0.7)

((: Ага. Мы опубликовали почти одновременно. Интересный второй вариант. Может быть, я найду время в отпуске, чтобы поближе взглянуть на пакет цветового пространства.

stefan 22.12.2020 09:36

@Tjebo, спасибо! Первый вариант - это именно то, что я ищу, только наоборот :) Я хочу настроить непрозрачность панели ошибок, а не самой панели. Можно ли этого достичь?

Emman 22.12.2020 09:46

Смотрите мой комментарий выше. Технически, альфа-канал делает ваш цвет «светлее», поэтому без изменения обоих альфа-каналов вы не сможете сделать вышележащие полосы ошибок «темнее».

tjebo 22.12.2020 09:48

Но потом. возможно ли добиться одинакового оттенка как в верхней части полосы ошибок, так и на полосе, как показано в вопросе?

Emman 22.12.2020 09:50

@Emman, если вы дадите одинаковую альфу, они будут иметь одинаковый вид. да. если вы не хотите альфы, это будет очень хакерским. для этого вам нужно будет создать два отдельных сегмента. Не уверен, что это стоило бы усилий

tjebo 22.12.2020 09:54

Возможно, вам следует нарисовать нижнюю половину полос погрешностей во второй раз чуть более темным цветом.

ggplot(my_df, aes(x = reorder(response, -estimate), y = estimate)) +
  geom_bar(stat = "identity", width = 0.9, fill = "#6EB3FF") +
  geom_errorbar(aes(ymin = lower_ci, ymax = upper_ci),
                width = 0.1, size = 3.5, color = "#6EB3FF") + 
  geom_errorbar(aes(ymin = lower_ci, ymax = estimate-0.004),
                width = 0.1, size = 3.5, color = "#3ba8ff")

Спасибо. Я тоже думал об этом. Одним из ограничений такого подхода является обобщаемость по цветам. Хотя здесь я использовал один цвет для всех полос, довольно часто для каждой полосы используется разный цвет или просто разные наборы цветов. Необходимость найти более темный цвет для нижнего сегмента в каждом случае делает такое решение непрактичным. Можете ли вы придумать «правило», которое позволит автоматизировать?

Emman 22.12.2020 20:27

Вы можете определить вектор именованных цветов как выбор для пользователей, скажем, color1 <- c("green1","red1","blue1","purple1","steelblue1"). Затем используйте немного более темный цвет для нижней половины полосы ошибок, как color3 <- c("green3","red3","blue3","purple3","steelblue3"). Вы должны определить большое количество цветов.

YBS 22.12.2020 21:15

@Emman, попробуй мыслить нестандартно! Объедините YBS и мой ответ, и у вас будет решение. То есть вы можете использовать пакеты оттенков, чтобы затемнить/осветлить целые палитры. Нет необходимости вручную указывать цвета. Простой.

tjebo 23.12.2020 19:21

@Tjebo, хорошая идея. Я согласен, что нет необходимости определять цвета. Просто используйте альфа = 0,7 для первых двух вызовов.

YBS 23.12.2020 20:27

Другие вопросы по теме