#r #pdf #ggplot2 #tidyr
Вопрос:
У меня есть df
фрейм данных с 4 уникальными UID
— 1001,1002,1003,1004
.
Я хочу написать user-defined function
в R, что делает следующее:
- Заговоры
Turbidity
противTime
для каждого уникальногоUID
. Значения мутностиTime_1
указаны в столбцахTime_2
Time_3
и. Например,UID = 1001
на одном графике будет 4 графика
- Добавьте легенду к каждому графику, например
M-L
,F-L
,M-R
, иF-R
(из столбцовGen
иType
) - Добавьте заголовок к каждому графику. Например-
UID:1001
- Экспортируйте графики в формате pdf, jpeg или tiff pdf — файлы-4 графика на страницу
# dataset
Gen <- c('M','M','M','M','F','F','F','F','M','M','M','M','F','F','F','F')
Site <- rep('FRX',length(gen))
Type <- c('L','L','L','L','L','L','L','L','R','R','R','R','R','R','R','R')
UID <- c(1001,1002,1003,1004,1001,1002,1003,1004,1001,1002,1003,1004,1001,1002,1003,1004)
Time_1 <- c(100.78,112.34,108.52,139.19,149.02,177.77,79.18,89.10,106.78,102.34,128.52,119.19,129.02,147.77,169.18,170.11)
Time_2 <- c(150.78,162.34,188.53,197.69,208.07,217.76,229.48,139.51,146.87,182.54,189.57,199.97,229.28,247.73,269.91,249.19)
Time_3 <- c(250.78,262.34,288.53,297.69,308.07,317.7,329.81,339.15,346.87,382.54,369.59,399.97,329.28,347.73,369.91,349.19)
df <- data.frame(Gen,Site,Type,UID,Time_1,Time_2,Time_3)
df
Моя попытка
library(ggplot2)
library(tidyr)
# See below for my thoughts/attempt- I am open to other R libraries and approaches
graphplotter <-function(x){
# 1. Convert from wide to long
data_long <- gather(df, time, turbidity, Time_1:Time_3, factor_key=TRUE)
data_long
#2. plot for each unique UID- 1001 to 1004 and add legend
basic <- ggplot(datalong, aes(time, turbidity, shape=Tree)) geom_point() geom_line()
basic theme(
legend.position = c(.95, .95),
legend.justification = c("right", "top"),
legend.box.just = "right",
legend.margin = margin(6, 6, 6, 6))
#3. add title
print(basic labs( title= "UID: 1001, Tubidity against time", y="turbidity", x = "Time in hours"))
#4. export as pdf
pdf("turbdity-time.pdf")
par(mfrow = c(2, 2)) ## set the layout to be 2 by 2
sapply(1:4, function(i) plot(basic[,i]))
dev.off()
}
Я хочу, чтобы все четыре графика выглядели примерно так (игнорируйте окружность и возраст, должны быть мутность и время).
Спасибо
Ответ №1:
Я использую facet_wrap
graphplotter <-function(x){
x %>%
gather(., time, turbidity, Time_1:Time_3, factor_key=TRUE) %>%
mutate(label = (paste0(Gen, "-", Type))) %>%
#group_by(UID) %>%
ggplot(aes(color = label)) geom_point(aes(time, turbidity, shape = label, group = label))
geom_line(aes(time, turbidity, group = label)) facet_wrap(~UID) theme(
legend.position = c(1, 1),
legend.justification = c("right", "top"),
legend.box.just = "right",
legend.margin = margin(1, 1, 1, 1),
legend.text = element_text(size = 7))
}
graphplotter(df)
Комментарии:
1. @Park..Это выглядит очень хорошо (большое спасибо!), Как я могу сделать «F-L»,
F-R
,M-L
иM-R
сюжеты имеют 4 разных цвета?2. @nasa313 цвета для точек или линий? Я редактирую код для них обоих
3. Это именно то, что я хочу(большое спасибо.) и последнее, на
1002
графике метка/легенда блокирует кончик графиков (я только что загрузил изображение графика в исходном вопросе). Можем ли мы переместить метку/легенду за пределы графика или просто сделать ее меньше?4. @nasa313 Я редактирую свой код, изменяю
legend.margin
и добавляюlegend.text
. Вы можете изменить эти параметры иlegend.position
изменить расположение легенды