Как «округлить» строки диапазона в ggplot

#r #dataframe #ggplot2 #graph #time-series

#r #фрейм данных #ggplot2 #График #временные ряды

Вопрос:

Я использую следующий R-код, чтобы предложить новый дизайн графика для работы. Было бы неплохо, если бы я мог закруглить концы красных полос на этом графике. Я думаю, что я должен где-то использовать lineend = «round», но я не могу заставить его работать. (Текущий график прилагается ниже).

 library(ggplot2)

# Create the Heart Rate data.
df2 <- data.frame(replicate(5, sample(25:110,24,rep=TRUE)))
colnames(df2) <- c("d1","d2","d3","d4","d5")
df2$hour=1:24
df2$min <- apply(df2[,1:5], 1, FUN=min)
df2$max <- apply(df2[,1:5], 1, FUN=max)
df2$mean <- apply(df2[,1:5], 1, FUN=mean)

q <- ggplot(df2, aes(hour, mean, colour = "red"))

#q   geom_linerange(aes(ymin = min, ymax = max)) # Without the mean points

q   geom_linerange(aes(ymin = min, ymax = max, size = 4))   
  theme(
    panel.background = element_rect(fill = "black",
                                    colour = "black",
                                    size = 0.5, linetype = "solid"),
    panel.grid.major = element_line(size = 0.5, linetype = 'dashed',
                                    colour = "gray"), 
    panel.grid.minor = element_line(size = 1, linetype = 'solid',
                                    colour = "black")
  )  
  geom_point(colour = "white", size =2)

  

Диапазон и средства повторных измерений с течением времени

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

1. Я думаю, вы могли бы использовать geom_segment() параметр lineend , установленный на «округление». Дайте мне знать, если вам нужна помощь в этом. Официальная документация здесь: ggplot2.tidyverse.org/reference/geom_segment.html

Ответ №1:

Вы правы в том, что вам нужно использовать lineend="round" аргумент. Как вы, вероятно, заметили, это неприемлемый аргумент для использования geom_linerange() . Как было предложено, вместо этого вы можете построить свои диапазоны строк, используя geom_segment() , который может принимать lineend= аргумент.

В документации указано, что geom_segment() будет рисовать линии, соединяя две точки: x , y и xend , yend . для вертикальных lineranges, x и xend будет таким же, в то время y как и yend будет соответствовать вашим ymin ymax значениям и, используемым в geom_linerange() коде.

Чтобы получить круглые строки, внесите следующее изменение:

 # substitute this:
# q   geom_linerange(aes(ymin = min, ymax = max, size = 4))  

# with this:

q   geom_segment(
  aes(x=hour, xend=hour, y=min, yend=max),
  size=4, lineend='round'
  )  
  

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

И последнее замечание: я заметил, что на диаграмме, которой вы поделились, было две легенды, в том числе одна для цвета и одна для размера. Я полагаю, вы не хотели, чтобы легенда для size появлялась там. ggplot2 создает легенду, когда у вас есть эстетика внутри aes() . Обратите внимание, что внутри geom_segment() я переместился size=4 , чтобы быть снаружи aes() . Следовательно, легенда для размера не была создана.

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

1. Это решение отлично подходит для этого случая. Проблема возникает, если вам нужно jitter или position_dodge (по крайней мере, я не могу найти решение). Геометрические фигуры не остаются параллельными при уклонении.