#r #plot
#r #график
Вопрос:
Я должен нарисовать график, чтобы показать, сколько времени живет один пациент между появлением симптомов и его смертью. Я нашел хороший точечный график в Google; Я адаптировал его, и вот именно то, что я бы выполнил.
Серая линия показывает стандартное отклонение, круг показывает среднее значение, а треугольники — минимальное и максимальное значения.
Чтобы попробовать, я подготовил свой набор данных следующим образом:
> 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
), где среднее, максимальное и минимальное значения будут в одном столбце. Затем я делаю этот график, меняя только форму и размер, чтобы соответствовать тому, что вы хотели по типу. Однако диапазон линий, похоже, требовал исходного фрейма данных, поэтому я его сохранил.