ggplot не устанавливает правильные цвета для категории диаграммы - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в R, и любая помощь очень ценится.У меня есть следующие (только для примера) данные о перемещениях робота между точками (вывод dt2).Ось X - это отметка времени каждого перемещения, а ось Y - индекс пятна, на который она перемещена.Проблема в том, что я не могу назначить фиксированные цвета каждому роботу и ограничить график только роботами в данных (3 в данном случае).От 1 до 5 роботов (от G до K) могут быть представлены в наборе данных.Я хочу, чтобы один скрипт обрабатывал все наборы данных, независимо от того, сколько роботов записано.

       moveID robot    stepStartTime       spotIndex    chartCategory    line_color
1         1     G    2018-05-31 23:13:00         2          Robot G NA       white
2         2     G    2018-05-31 23:13:00         4          Robot G NA       white
3         3     G    2018-05-31 23:13:00         8          Robot G NA       white
....
29       29     G    2018-05-31 23:17:10        26   Robot G Efficient      green4
30       30     G    2018-05-31 23:20:10        26   Robot G Efficient      green4
31       31     G    2018-05-31 23:21:10        26   Robot G Efficient      green4
32       32     G    2018-05-31 23:23:10        26   Robot G Efficient      green4
....
115     115     G    2018-06-01 02:23:10        30   Robot G Efficient      green4
116     116     G    2018-06-01 02:25:10        18 Robot G Inefficient         red
117     117     G    2018-06-01 02:26:10        18   Robot G Efficient      green4
118     118     G    2018-06-01 02:27:10        18   Robot G Efficient      green4
119     119     G    2018-06-01 02:29:10        14   Robot G Efficient      green4
....
164     164     H    2018-05-31 23:12:00         2          Robot H NA       white
165     165     H    2018-05-31 23:12:00         4          Robot H NA       white
166     166     H    2018-05-31 23:12:00         8          Robot H NA       white
....
193     193     H    2018-05-31 23:12:00         6   Robot H Efficient    dodgerblue1
194     194     H    2018-05-31 23:14:12         6   Robot H Efficient    dodgerblue1
195     195     H    2018-05-31 23:21:12        10   Robot H Efficient    dodgerblue1

Я использую следующий код:

   dataset = read.csv("C:/Users/User/R Chart/Data_1.csv", header = TRUE, sep = ",", quote = "", dec = ".", fill = TRUE, comment.char = "")

library("ggplot2")
library("dplyr")

options(max.print = 2000)

dataset$stepStartTime <- as.POSIXct(dataset$stepStartTime, format="%Y/%m/%dT%H:%M:%S")

dt2 <- dataset %>%
  mutate(line_color = case_when(
    chartCategory == "Robot G NA" ~ "white",
    chartCategory == "Robot H NA" ~ "white",
    chartCategory == "Robot I NA" ~ "white",
    chartCategory == "Robot J NA" ~ "white",
    chartCategory == "Robot K NA" ~ "white",
    chartCategory == "Robot G Inefficient" ~ "red",
    chartCategory == "Robot H Inefficient" ~ "red",
    chartCategory == "Robot I Inefficient" ~ "red",
    chartCategory == "Robot J Inefficient" ~ "red",
    chartCategory == "Robot K Inefficient" ~ "red",
    chartCategory == "Robot G Efficient" ~ "green4", # green #229954  (ends bay 30)
    chartCategory == "Robot H Efficient" ~ "dodgerblue1",  #blue #5dade2   (ends bay 18)
    chartCategory == "Robot I Efficient" ~ "grey62", # violet #9b59b6  (ends bay 38)
    chartCategory == "Robot J Efficient" ~ "chocolate2",  # red  #EC7063   (ends bay 14)
    chartCategory == "Robot K Efficient" ~ "orange1",   # orange  #f5b041  (ends bay 22)

  ))
dt2
p = ggplot(data=dt2, aes(stepStartTime, spotIndex, group=robot, color=line_color))+
  geom_step(size = 1)+ 
  geom_point( size = 6, shape = 'I') +
  theme(
    legend.position='none',
    axis.line = element_line(colour = "#000000", size = 0.3, linetype = "solid"),
    axis.ticks.x =  element_line(size = 1), 
    axis.ticks.y =  element_line(size = 1), 
    axis.text.x = element_text(face="plain", color="#808080", size=9, angle=0), 
    axis.text.y = element_text(face="plain", color="#808080", size=9, angle=0), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(),
    panel.border = element_rect(linetype = "solid", colour = "#808080", size = 1, fill = NA),
    panel.background = element_rect(fill = "transparent", colour = NA),
    plot.background = element_rect(fill = "transparent", colour = NA)
  )
p +
  scale_y_reverse(breaks=c(66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30, 28,26,24,22,20,18,16,14,12,10,8,6,4,2),lim=c(66,2)) 

В настоящее время диаграмма выглядит какследующий.Есть 5 участков, но данные есть только у 3 роботов.enter image description here

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вот мое окончательное решение.Следующая задача - добавить линии сетки и выяснить, как получить 30-минутные разрывы даты по оси X.

rm(list = ls())  # Clear out the environment/workspace
setwd("C:/Users/user/R_Chart/robot_moves/Chart_Final")

dataset = read.csv("C:/Users/User/R_Chart/Data_1.csv", header = TRUE, sep = ",", quote = "", dec = ".", fill = TRUE, comment.char = "")
dataset
library("ggplot2")
library("dplyr")
library("scales")

#options(max.print = 1000)  

dataset$stepStartTime <- as.POSIXct(dataset$stepStartTime, format="%Y-%m-%dT%H:%M:%S") # source data date format

cols = c("robot G NA"="grey90",
        "robot H NA"="grey90",
        "robot I NA"="grey90",
        "robot J NA"="grey90",
        "robot K NA"="grey90",
        "robot G Inefficient"="red",
        "robot H Inefficient"="red",
        "robot I Inefficient"="red",
        "robot J Inefficient"="red",
        "robot K Inefficient"="red",
        "robot G Efficient"="green4",
        "robot H Efficient"="dodgerblue1",
        "robot I Efficient"="darksalmon",
        "robot J Efficient"="thistle4",
        "robot K Efficient"="burlywood2")


p = ggplot(data=dataset, aes(stepStartTime, spotIndex, group=robot, color=chartCategory))+
  geom_step(direction = 'hv',size = 1)+ 
  geom_point( size = 6, shape = 'I') +
  scale_color_manual(values = cols)+

  scale_x_datetime(breaks = date_breaks ("1 hour"), labels = date_format("%d-%m\n%H:%M", tz="")) +

  theme(
    legend.position='none',
    axis.line = element_line(colour = "#000000", size = 0.3, linetype = "solid"),
    axis.ticks.x =  element_line(size = 1), 
    axis.ticks.y =  element_line(size = 1), 
    axis.text.x = element_text(face="plain", color="gray15", size=7, angle=0), 
    axis.text.y = element_text(face="plain", color="gray15", size=7, angle=0), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(),
    panel.border = element_rect(linetype = "solid", colour = "#808080", size = 1, fill = NA),
    panel.background = element_rect(fill = "transparent", colour = NA),
    plot.background = element_rect(fill = "transparent", colour = NA)
  )
p +
  scale_y_reverse(breaks=c(66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30, 28,26,24,22,20,18,16,14,12,10,8,6,4,2),lim=c(68,2)) 

#ggsave("V4.png", width = 6, height = 6)

The plot

0 голосов
/ 19 сентября 2018

Вам необходимо установить цвета с помощью функции scale_color_*.ggplot использует line_color в качестве фактора для определения цветовых групп, но ему все равно, что цветовые группы названы в честь цветов: он обрабатывает их так же, как если бы они были dog, catfish.

df <- data.frame(x = c(1,2,3,1,2,3,1,2,3),
                 y = c(1,2,3,2,3,4,4,2,3),
                 col = c('red', 'red', 'red', 'green', 'green', 'green', 'blue', 'blue', 'blue'))

ggplot(df, aes(x, y, color = col)) +
    geom_line()

enter image description here

Вам необходимо указать, какие цвета соответствуют тем значениям переменной, которые вы передали аргументу color=aes.Для этого вы используете функции scale_color_*.Поскольку col является категориальным, передача именованного вектора аргументу values= в scale_color_manual является самым простым:

ggplot(df, aes(x, y, color = col)) +
    geom_line() +
    scale_color_manual(values = c('red' = 'red', 'green' = 'green', 'blue' = 'blue'))

enter image description here

Inв вашем случае, поскольку уровни уже являются цветами, вы можете сделать трюк, используя setNames, чтобы использовать эти значения в одной строке:

ggplot(df, aes(x, y, color = col)) +
    geom_line() +
    scale_color_manual(values = setNames(unique(df$col), unique(df$col)))

enter image description here

values= ожидает именованный вектор: значения - это цвета, а имена - это значения переменной, переданной в aes для присвоения этого цвета.setNames(unique(df$col), unique(df$col)) просто создает именованный вектор из всех уникальных значений df$col с одинаковыми именами и значениями: поэтому к каждому «цвету» этот цвет будет применен к его линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...