Выполните сложный горизонтальный точечный график в R, показывающий минимальное, максимальное, среднее и стандартное значение

#r #plot

#r #график

Вопрос:

Я должен нарисовать график, чтобы показать, сколько времени живет один пациент между появлением симптомов и его смертью. Я нашел хороший точечный график в Google; Я адаптировал его, и вот именно то, что я бы выполнил.

img

Серая линия показывает стандартное отклонение, круг показывает среднее значение, а треугольники — минимальное и максимальное значения.

Чтобы попробовать, я подготовил свой набор данных следующим образом:

 > structure(REx)
   Symptom Treatment     Mean    STD    Max Min
1       E1  Treated     4.44     1.39     6   1
2       E2  Treated     3.66     0.83     4   2
3       E3  Treated     3.50     1.94     7   1
4       E4  Treated     3.77     1.23     6   1
5       E5  Treated     3.20     2.16     6   1
6       E1   UTC        1.86     1.25     6   1
7       E2   UTC        1.96     1.09     5   1
8       E3   UTC        1.75     1.38     7   1
9       E4   UTC        1.95     1.23     6   1
10      E5   UTC        1.77     0.85     4   1
  

Я пытался использовать ggdotchart command, но мне не удалось получить график.
У кого-нибудь есть предложения?

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

1. Что такое серые линии? Обязательно ли такая легенда?

Ответ №1:

Вот первый черновик с базовым построением:

 REx$Symptom <- factor(REx$Symptom)
REx$Color   <- ifelse(REx$Treatment == "Treated", "red", "blue")


par(mgp=c(2,0.5,0), las=1, cex.axis=0.8, tck=-0.01, yaxs="i", xaxs="i")

plot.new()
plot.window(xlim=range(0, REx$Max 1), ylim=range(0, as.numeric(REx$Symptom) 1))

abline(h=REx$Symptom, col="grey", lty=3, lwd=0.5)
abline(v=0:ceiling(max(REx$Max)), col="grey", lwd=1.5)

segments(REx$Mean - REx$STD, as.numeric(REx$Symptom), REx$Mean   REx$STD, col=adjustcolor("grey", 0.5), lwd=5)
points(REx$Mean, REx$Symptom, pch=19, col=REx$Color)
points(REx$Min,  REx$Symptom, pch=17, col=REx$Color)
points(REx$Max,  REx$Symptom, pch=17, col=REx$Color, cex=1.5)

axis(1, at=1:ceiling(max(REx$Max)))
axis(3, at=1:ceiling(max(REx$Max)), label=NA)
axis(2, at=REx$Symptom, label=REx$Symptom)
box(lwd=1.5)

legend(6.5, 3, legend=paste(c("Mean", "Max", "Min", "SD"), "Treated"), cex=0.8, bg="white",
       pch=c(19,17,17,NA), pt.cex=c(1,1.5,1,NA), lwd=c(NA,NA,NA,2), col=c("red", "red", "red", "grey")
       )
legend(6.5, 1.5, legend=paste(c("Mean", "Max", "Min", "SD"), "UTC"), cex=0.8, bg="white",
       pch=c(19,17,17,NA), pt.cex=c(1,1.5,1,NA), lwd=c(NA,NA,NA,2), col=c("blue", "blue", "blue", "grey")
       )
  

изображение

Ответ №2:

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

 REx2 <- REx %>%
  gather(key = "StatsType", value = "Value", -c(1:2, 4))

ggplot() 
  geom_linerange(data = REx, aes(xmin = Mean-STD, xmax = Mean STD, y = Symptom), colour = "gray", size = 1.5) 
  geom_point(data = REx2, aes(x = Value, y = Symptom, colour = Treatment, size = StatsType, shape = StatsType)) 
  scale_shape_discrete(limits = c("Mean", "Max", "Min"), breaks = c(19, 17, 17), labels = c("Mean", "Max", "Min"), guide = "legend") 
  scale_size_discrete(limits = c("Mean", "Max", "Min"), breaks = c(1, 2, 1)) 
  theme_bw()
  

Однако обратите внимание, что я согласен с предупреждением:

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

Во-первых, я создал второй фрейм данных, используя library(dplyr) и library(tidyr) (обе части tidyverse , например ggplot2 ), где среднее, максимальное и минимальное значения будут в одном столбце. Затем я делаю этот график, меняя только форму и размер, чтобы соответствовать тому, что вы хотели по типу. Однако диапазон линий, похоже, требовал исходного фрейма данных, поэтому я его сохранил.