#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 (по крайней мере, я не могу найти решение). Геометрические фигуры не остаются параллельными при уклонении.