0

我正在尝试使用荧光笔列和 gghighlight 仅在绘图中显示选择的汽车(来自 mtcars 数据集)。我希望颜色与突出显示的汽车相匹配,因为它们在同一行,但颜色混合在一起。

下面是使用 mtcars 的完全可重现的示例。

library(shiny)
library(tidyverse)
library(ggthemes)
library(gghighlight)

color_list <- c("darkred", "yellow3", "green4", "darkblue", "purple",
            "pink2", "burlywood1", "aquamarine", "orange3", "black")

mtcars_clean <- 
mtcars %>% 
rownames_to_column(var = "car") %>% 
head(10) %>% 
mutate(car_color = color_list) %>% 
glimpse()

View(mtcars_clean)

正如您从图片链接中看到的那样,每辆汽车都有一个特定的 car_color 应该在汽车被突出显示时显示。

mtcars_clean 表

selected_cars <- c("Mazda RX4", "Hornet 4 Drive", "Valiant", "Merc 240D", "Duster 360")

mtcars_test <- 
mtcars_clean %>% 
mutate(highlighter = case_when(car %in% selected_cars ~ "yes",
                               T ~ "no"),
       car_color = case_when(highlighter == "yes" ~ car_color,
                             T ~ "#C4CED4"))

p_test <-
mtcars_test %>%
ggplot(aes(x = mpg, y = reorder(car, mpg, max))) +
geom_col(aes(fill = car)) +
geom_text(data = mtcars_test %>%
              filter(car %in% selected_cars),
          aes(label = mpg, x = mpg + 1, col = highlighter)) +
theme_fivethirtyeight() +
theme(legend.position = "none") +
labs(title = "MPG by Car") +
scale_color_manual(values = c("black")) +
gghighlight(car %in% selected_cars)

p_test + scale_fill_manual(name = p_test$data$car, values = p_test$data$car_color)

但是,正如您从下图中看到的那样,汽车“Merc 240D”应该是海蓝宝石,但它是 burlywood1。Valiant应该是pink2,但它是海蓝宝石。汽车不会保留 car_color 列中属于它们的颜色。

mtcars_clean ggplot 输出

同样奇怪的是 geom_text 保持正确的值,但是 car_color 移动。

4

1 回答 1

1

从文档中help(scale_fill_manual)

值: 一组美学值,用于将数据值映射到。这些值将按顺序(通常按字母顺序)与比例的限制匹配,或者如果提供了中断。如果这是一个命名向量,则将根据名称匹配值。不匹配的数据值将被赋予 na.value。

我们可以使用它来稍微更改代码并使其按预期工作

cols <- p_test$data$car_color
names(cols) <- p_test$data$car
p_test + scale_fill_manual(values = cols)

在此处输入图像描述

或者我们可以使用breaks

中断: 其中之一:
NULL 表示无中断
waiver() 表示默认中断(比例限制)
中断的字符向量
将限制作为输入并返回中断作为输出的函数

例如。我们也可以

p_test + scale_fill_manual(values = p_test$data$car_color, breaks = p_test$data$car)

类似的方法可以与aes对象内的现有美学一起使用。

于 2020-05-17T17:48:05.580 回答