геометрическая точка ggplot2 с цветом только тогда, когда значение y отличается от 0

#r #ggplot2

#r #ggplot2

Вопрос:

Я работаю в R, и у меня есть таблица из трех столбцов:

  • Date , столбец дат
  • pnl , непрерывный столбец double. Тем не менее, этот столбец в основном = 0 и несколько раз ! = 0.
 Date <- structure(c(16636, 16667, 16698, 16728,16759, 16789, 16820, 16851), class = "Date") 
pnl = structure(c(0, 0, 5, 0, 10, 2.2, 0, 0))          
df <- cbind(Date,pnl) %>% as_tibble()
  

Я хочу построить график с помощью ggplot:

  • Date, on the x axis
  • cumsum(pnl) , на оси y в виде линейного графика
  • Я хочу добавлять точку поверх cumsum(pnl) линейного графика всякий pnl раз, когда значение отличается от 0 .

Я попробовал следующее:

 ggplot(data = df)   
    geom_line(aes(x = Date, y = cumsum(pnl)), color = "blue")  
    geom_point(aes(x = Date, y = ifelse(pnl != 0, cumsum(pnl),0), color = ifelse(pnl != 0,1,0)))
  

Но это выдает ошибку. Есть идеи, как решить эту проблему? Большое спасибо.

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

1. Пожалуйста, предоставьте некоторые примеры данных

Ответ №1:

Попробуйте создать переменную для цвета следующим образом:

 library(tidyverse)
#Data
Date <- structure(c(16636, 16667, 16698, 16728,16759, 16789, 16820, 16851), class = "Date") 
pnl = structure(c(0, 0, 5, 0, 10, 2.2, 0, 0))          
df <- data.frame(Date,pnl)
#Color
df$Color=ifelse(df$pnl!= 0,1,0)
#Plot
ggplot(data = df)   
  geom_line(aes(x = Date, y = cumsum(pnl)), color = "blue")  
  geom_point(aes(x = Date, y = ifelse(pnl != 0, cumsum(pnl),0),color=factor(Color))) 
  scale_x_date(date_labels = '%Y-%m-%d')
  

Вывод:

введите описание изображения здесь

Или более настраиваемый:

 #Plot 2
ggplot(data = df)   
  geom_line(aes(x = Date, y = cumsum(pnl)), color = "blue")  
  geom_point(aes(x = Date, y = ifelse(pnl != 0, cumsum(pnl),0),color=factor(Color))) 
  scale_x_date(date_labels = '%Y-%m-%d') 
  scale_color_manual('Value',values=c('red','blue'))
  

Вывод:

введите описание изображения здесь

Для прозрачного цвета:

 #Plot 3
ggplot(data = df)   
  geom_line(aes(x = Date, y = cumsum(pnl)), color = "blue")  
  geom_point(aes(x = Date, y = ifelse(pnl != 0, cumsum(pnl),0),color=factor(Color))) 
  scale_x_date(date_labels = '%Y-%m-%d') 
  scale_color_manual('Value',values=c('transparent','blue')) 
  theme(legend.position = 'none')
  

Вывод:

введите описание изображения здесь

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

1. Это здорово, тем не менее, есть ли способ не иметь цвета вместо красного, когда pnl == 0? Или цвет, который не был бы виден, например, белые точки на белом фоне, когда pnl == 0 и синие точки в противном случае?

2. @Vitomir Позвольте мне настроить серый цвет на ноль!

3. @Vitomir Я добавил обновление. Я надеюсь, что это может быть полезно для того, что вы хотите!