Как применить сплошные цвета к линиям ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

Я ищу способ печатать разные строки с разными цветами на ggplot2. Я не знаю, почему это работает, когда я печатаю свой график с переменной в качестве цвета, но когда я устанавливаю сплошной цвет в своей eastethics, я получаю сообщение об ошибке

 Error: Discrete value supplied to continuous scale
  

Источник ошибки указывается с комментарием

 X3500um_0to50_tx2rx1 X15_30_45_rx2tx2 <- data.frame(
 Time = c(2020-11-03 15:20:00, 2020-11-03 15:20:01), 
 Diff_Touchpad0_Rx1_Tx2= c(2782, 27804),
 Diff_Touchpad0_Rx2_Tx0= c(2782, 27804),
 Diff_Touchpad0_Rx2_Tx1= c(2782, 27804),
 Diff_Touchpad0_Rx2_Tx2= c(2782, 27804))
 

ggplot(X3500um_0to50_tx2rx1, aes(Time, Diff_Touchpad0_Rx1_Tx2))  
  geom_line(aes(colour = Diff_Touchpad0_Rx1_Tx2))     
  
  geom_line(aes(Time, Diff_Touchpad0_Rx2_Tx0))     
  geom_line(aes(Time, Diff_Touchpad0_Rx2_Tx1, colour = "red"))     #causes an error??
  geom_line(aes(Time, Diff_Touchpad0_Rx2_Tx2, colour = Diff_Touchpad0_Rx2_Tx2))
  

Комментарии:

1. aes(colour=Diff_Touchpad0_Rx2_Tx2) сопоставляет переменную Diff_Touchpad0_Rx2_Tx2 с colour , что означает, что линии с разными значениями Diff_Touchpad0_Rx2_Tx2 будут иметь разный цвет, и цвет будет определяться на основе палитры по умолчанию, если не изменен с помощью одной из scale_colour_*** функций. Если Diff_Touchpad0_Rx2_Tx2 значение числовое (как здесь), отображение цветов будет в непрерывном градиентном масштабе. Если вы хотите жестко запрограммировать цвет, удалите отображение цветов внутри aes и добавьте colour="red" снаружи aes .

2. Ошибка заключается в том, что вы пытаетесь отобразить colour внутри aes дискретное значение, но вы уже сопоставили цвет с непрерывным значением в предыдущем geom_line вызове. Если вы переместите 3-й geom_line вызов выше остальных (так, чтобы он был первым), вы получите обратную ошибку Continous value supplied to discrete scale .

3. Главы 3, 7 и 28 R for Data Science могут быть полезны для получения дополнительной информации о том, как работает ggplot.

Ответ №1:

Ошибка заключается в том, что вы передаете несуществующую переменную «red» в colour эстетику. Эстетика — это, по сути, визуальные эффекты. Синтаксис для эстетики таков aes = variable . Ошибка возникает из-за отсутствия переменной с именем «red» в вашем фрейме данных. colour = Diff_Touchpad0_Rx2_Tx2 работает, потому что у вас есть переменная, вызываемая Diff_Touchpad0_Rx2_Tx2 в ваших данных, и поэтому R автоматически назначает уровни цвета на основе значений этой переменной. Поскольку ваша характеристика red является глобальной, ее следует выполнять за пределами aes . Итак, следующий код должен выдать то, что вы ищете:

 if(!require(tidyverse)) install.packages('tidyverse'); library(tidyverse)
if(!require(parsedate)) install.packages('parsedate'); library(parsedate)

X3500um_0to50_tx2rx1 <- data.frame(
  Time = c(parse_iso_8601("2020-11-03T15:20:00"),
           parse_iso_8601("2020-11-03T15:20:01")), 
  Diff_Touchpad0_Rx1_Tx2= c(2782, 27804),
  Diff_Touchpad0_Rx2_Tx0= c(2782, 27804),
  Diff_Touchpad0_Rx2_Tx1= c(2782, 27804),
  Diff_Touchpad0_Rx2_Tx2= c(2782, 27804))

ggplot(X3500um_0to50_tx2rx1, aes(Time, Diff_Touchpad0_Rx1_Tx2))  
  geom_line(aes(colour = Diff_Touchpad0_Rx1_Tx2))     
  geom_line(aes(Time, Diff_Touchpad0_Rx2_Tx0))     
  geom_line(aes(Time, Diff_Touchpad0_Rx2_Tx1), colour = "red")
  

Я бы также рекомендовал чтения, предложенные @eipi10.