ggplot add geom_path с другим цветом aestheti c // Ошибка: ошибка: недостаточно значений в ручном масштабе - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь соединить geom_points в моем ggplot с geom_path. Линии должны быть того же цвета, что и цвет заливки geom_point. Однако geom_path не знает заливки, а цвет используется для другой группировки.

Я также выделяю некоторые geom_points черным контуром, используя

scale_color_manual(values = c("NA", "black"), labels = c("No Buy Box", "Buy Box"))

Что я могу сделать? На самом деле, я хочу построить точки разным цветом (заполнить) по продавцу, выделите некоторые из этих точек с помощью color = black, если bbox = 1, и, кроме того, соедините точки их цветом, используя geom_path. Я предполагаю, что есть некоторые более общие проблемы в том, как я расположил графики в терминах подвыборки. geom_path не знает fill , это было бы самым простым решением. Фрагмент данных находится в конце этого сообщения.

Спасибо !!

ggplot(data = subset(algo_pricing,bbox_product == 9200000096286280), aes(x = bbox_time2)) +
  geom_point(mapping = aes(y = price_total, colour = as.factor(bbox), fill = seller_id), shape = 21) +
  geom_line(data = subset(algo_pricing, bbox ==1 & bbox_product == 9200000096286280), 
            mapping = aes(y = bbox_price, linetype = as.factor(bbox)),colour = "black") +
  geom_path(mapping = aes(y = price_total, colour = seller_id), linetype = "dotted") +
  scale_linetype_manual(values = "dotted", labels = "Buy Box Price") +
  scale_color_manual(values = c("NA", "black"), labels = c("No Buy Box", "Buy Box"))
example <- wrapr::build_frame(
   "bbox_time2"           , "bbox_price", "price_total", "seller_id"            , "bbox", "min_price", "bbox_product" |
     as.Date("2019-01-07"), 151         , 169.9        , "linkerlisse"          , 0L    , 129.5      , 4.641e-308     |
     as.Date("2019-01-18"), 125         , 169.9        , "linkerlisse"          , 0L    , 112        , 4.641e-308     |
     as.Date("2019-01-20"), 125         , 169.9        , "goedslapennl"         , 0L    , 118.5      , 4.641e-308     |
     as.Date("2019-01-14"), 120         , 169.9        , "decoware"             , 0L    , 114.3      , 4.641e-308     |
     as.Date("2019-01-18"), 125         , 169.9        , "goedslapennl"         , 0L    , 112        , 4.641e-308     |
     as.Date("2019-01-19"), 125         , 125          , "bol.com"              , 1L    , 125        , 4.641e-308     |
     as.Date("2019-01-20"), 125         , 169.9        , "decoware"             , 0L    , 121        , 4.641e-308     |
     as.Date("2019-01-19"), 125         , 169.9        , "decoware"             , 0L    , 124.2      , 4.641e-308     |
     as.Date("2019-01-10"), 135         , 120.3        , "hetbestebeddengoed.nl", 0L    , 120.3      , 4.641e-308     |
     as.Date("2019-01-11"), 135         , 135          , "bol.com"              , 1L    , 115.5      , 4.641e-308     |
     as.Date("2018-12-31"), 151         , 151          , "bol.com"              , 1L    , 143.8      , 4.641e-308     |
     as.Date("2019-01-17"), 125         , 169.9        , "goedslapennl"         , 0L    , 116.2      , 4.641e-308     |
     as.Date("2019-01-20"), 125         , 169.9        , "goedslapennl"         , 0L    , 119.8      , 4.641e-308     |
     as.Date("2019-01-17"), 125         , 169.9        , "goedslapennl"         , 0L    , 115.5      , 4.641e-308     |
     as.Date("2019-01-22"), 112.3       , 112.3        , "hetbestebeddengoed.nl", 1L    , 112.3      , 4.641e-308     |
     as.Date("2019-01-01"), 151         , 169.9        , "linkerlisse"          , 0L    , 142.1      , 4.641e-308     |
     as.Date("2019-01-21"), 125         , 127.5        , "sleepworld"           , 0L    , 117.8      , 4.641e-308     |
     as.Date("2018-12-31"), 151         , 151          , "bol.com"              , 1L    , 142.8      , 4.641e-308     |
     as.Date("2019-01-18"), 125         , 169.9        , "smulderstextiel.nl"   , 0L    , 125        , 4.641e-308     |
     as.Date("2019-01-01"), 151         , 169.9        , "linkerlisse"          , 0L    , 141.2      , 4.641e-308     )

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Попробуйте, трудно скопировать ваш фрейм данных, но у меня были похожие проблемы, и сработало следующее.

Сначала определите ваш цвет и значения (также я не совсем понимаю, что вы пытаетесь сделать с "NA" здесь, вы должны иметь цвета, а не NA). У вас также есть один цвет, определенный для двух разных графиков (линия и путь, убедитесь, что вы добавили его для двух отдельно).

Также взгляните на это решение: [ график ниже показывает 2 легенды при управлении Шкала цветная ручная


cl <- c("black" = "Buy Box", "blue" = "No Buy Box")
ggplot(data = subset(algo_pricing,bbox_product == 9200000096286280), aes(x = bbox_time2)) +
  geom_point(mapping = aes(y = price_total, colour = as.factor(bbox), fill = seller_id), shape = 21) +
  geom_line(data = subset(algo_pricing, bbox ==1 & bbox_product == 9200000096286280), 
            mapping = aes(y = bbox_price, linetype = as.factor(bbox)),colour = "Buy Box") +
  geom_path(mapping = aes(y = price_total, colour = seller_id), linetype = "dotted", colour = "No Buy Box") +
  scale_color_manual(values = c("blue", "black"))

1 голос
/ 15 апреля 2020

Это, вероятно, замысловатый сюжет дня! Для того, чтобы положить в свои два цента на сумму: Чем больше я визуализации, тем больше я думаю, что если вы боретесь трудно получить вещи сделано с ggplot, это, возможно, признак того, что ваша визуализация не может быть идеальным. Возможно, подумайте об уменьшении количества измерений, которые вы хотите показать на вашем графике.

Тем не менее, это очень хорошее упражнение для отображения и контроля эстетики.

Требуется небольшая обработка данных, контроль уровня фактора и контроль количества точек на сюжет за раз. Я решил это, просто удалив дублирующиеся записи для каждого раза. Вы должны решить, как вы будете управлять этим.

Я также добавил немного дрожания к ценам, чтобы вы могли лучше видеть линии. Это немного искажает значения, но вы можете изменить величину дрожания.

Другие комментарии в коде.

library(tidyverse)
example <- example %>% 
  distinct(seller_id, bbox_time2,.keep_all = TRUE) %>%
  mutate(bbox_sell  = paste(seller_id, bbox, sep = '_'),
         price_total = jitter(price_total, amount = 1)) %>%
  arrange(bbox_time2, seller_id)   # arranging is important for geom_path


ggplot( # setting the general aesthetics. You could do this in each geom call, but I am a bit lazy, so I define the main aesthetics here. 
  data = example,
  aes(
    x = bbox_time2,
    y = price_total,
    group = seller_id
  )
) +
  geom_point(
    aes(colour = seller_id) # color aesthetic matches the following geom_path.
# also, the shape defaults to 16. This avoids messing with both fill and color aesthetic. 
  ) +
  geom_path(
    aes(colour = seller_id),
    linetype = "dotted"
  ) +
  geom_path(
    data = filter(example, bbox == 1),
    aes(linetype = "box1", group = bbox_sell),
    colour = "black".   # color defined outside of aesthetic! 
  ) +
  scale_linetype_manual(name = NULL, values = "dotted", labels = "Buy Box Price") +
  ggnewscale::new_scale_colour() + # now here's an option how to easily create two color scales. 
  geom_point(
    data = filter(example, bbox == 1),
    aes(color = as.character(bbox)), # you can now use a new color scale. 
    shape = 21, # using a different shape for the highlighted points
  ) +
  scale_color_manual(name = NULL, values = "black", labels = "Buy Box") 

Порядок легенды, конечно, своеобразен. Управление порядком легенды - это нечто, , и «обычный» способ управления им с помощью + guides(xxx = guide_legend(order =...)), похоже, не работает с ggnewscale.

Создано в 2020-04-15 пакетом Представить (v0.3.0)

...