如何将geom_bar,geom_point和geom_line合并为一个图形? [英] How to combine geom_bar, geom_point, and geom_line into one figure?
问题描述
我正在尝试通过三个并行条件(CET,RES,END)和对干预的响应(高或低,即CET_Hi,CET_Lo等)可视化两个时间点(干预前后)的连续数据点
我想创建一个条形图,在X轴上显示每个条件的平均输出,并用单独的条形表示时间(前和后)。然后,我想在Pre和Post上的各个Subject数据点上覆盖线以连接Subject数据点,并按颜色对响应进行分组。
我有使用带有geom_bar函数的ggplot2成功创建了条形图。我也有geom_point可以按条件叠加各个点,但是无法使位置与时间对齐。
ggplot(Leg_Press_Summary,aes(x = Condition,y = Leg_Press,fill = as.factor(Time)))+
geom_bar(stat = identity,position = position_dodge())+
scale_fill_brewer(palette = Blues,name = Time,标签= c( Pre, Post))+
geom_point(数据=物理数据,aes(x =条件,y =腿部压力,颜色=响应,填充= as.factor(时间)))+
geom_line(数据= Phys_Data,aes(x =条件,y = Leg_Press,group = Subject))+
labs(title = Leg Press,x = Condition,y = Leg Press(kg))
我希望geom_points可以根据时间进行定位,但是,对于每种情况,它们指向的位置都垂直于Pre和Post之间的垂直线。
我的结果:
图我正在尝试重新创建:
我解决了这个问题?
下面包含的数据集,我忘了包含在原始帖子中。
LegPress
#小技巧:36 x 5
主体时间条件响应Leg_Press
6 1 CET CET_Hi 212.
6 2 CET CET_Hi 300
9 1 CET CET_Lo 350
9 2 CET CET_Lo 370
14 1 CET CET_Hi 330
14 2 CET CET_Hi 450
26 1 CET CET_Hi 180
26 2 CET CET_Hi 250
28 1 CET CET_Lo 230
28 2 CET CET_Lo 275
29 1 CET CET_Lo 330
29 2 CET CET_Lo 325
2 1 RES RES_Hi 142.
2 2 RES RES_Hi 225
16 1 RES RES_Lo 280
16 2 RES RES_Lo 320
19 1 RES RES_Hi 205
19 2 RES RES_Hi 295
27 1 RES RES_Hi 175
27 2 RES RES_Hi 2 60
31 1 RES RES_Lo 340
31 2 RES RES_Lo 370
32 1 RES RES_Lo 310
32 2 RES RES_Lo 370
8 1 END END_Lo 205
8 2 END END_Lo 250
13 1 END END_Hi 310
13 2 END END_Hi 320
20 1 END END_Hi 200
20 2 END END_Hi 185
24 1 END END_Lo 260
24 2 END END_Lo 270
25 1 END END_Hi 210
25 2 END END_Hi 235
30 1 END END_Lo 250
30 2 END END_Lo 245
它认为这是您要使用(v0.3.0)
I am trying to visualize continuous data points across two Time points (pre and post intervention) with three parallel Conditions (CET, RES, END), and Response to intervention (High or Low, i.e., CET_Hi, CET_Lo, etc)
I'd like to create a bar graph showing the mean output for each Condition on the X-axis, with separate bars for Time (Pre and Post). Then, I'd like to overlay the individual Subject data points at Pre and Post with lines to connect the Subjects data points and have the Responses grouped by color.
I have successfully created the bar graph using ggplot2 with the geom_bar function. I have also got geom_point to overlay the individual points by condition, but can't get the position aligned with the Time.
ggplot(Leg_Press_Summary, aes(x=Condition, y=Leg_Press, fill=as.factor(Time))) +
geom_bar(stat="identity", position=position_dodge()) +
scale_fill_brewer(palette="Blues", name = "Time", labels = c("Pre", "Post")) +
geom_point(data=Phys_Data, aes(x=Condition, y=Leg_Press, colour=Response, fill=as.factor(Time))) +
geom_line(data=Phys_Data, aes(x=Condition, y=Leg_Press, group=Subject)) +
labs(title="Leg Press", x="Condition", y ="Leg Press (kg)")
I expected the geom_points to be positioned according to Time, however, they points just stack in a vertical line between the Pre and Post bars for each condition.
My result:
Figure I'm trying to recreate:
How can I fix this?
Data set included below, which I forgot to include in original post.
LegPress
# A tibble: 36 x 5
Subject Time Condition Response Leg_Press
6 1 CET CET_Hi 212.
6 2 CET CET_Hi 300
9 1 CET CET_Lo 350
9 2 CET CET_Lo 370
14 1 CET CET_Hi 330
14 2 CET CET_Hi 450
26 1 CET CET_Hi 180
26 2 CET CET_Hi 250
28 1 CET CET_Lo 230
28 2 CET CET_Lo 275
29 1 CET CET_Lo 330
29 2 CET CET_Lo 325
2 1 RES RES_Hi 142.
2 2 RES RES_Hi 225
16 1 RES RES_Lo 280
16 2 RES RES_Lo 320
19 1 RES RES_Hi 205
19 2 RES RES_Hi 295
27 1 RES RES_Hi 175
27 2 RES RES_Hi 260
31 1 RES RES_Lo 340
31 2 RES RES_Lo 370
32 1 RES RES_Lo 310
32 2 RES RES_Lo 370
8 1 END END_Lo 205
8 2 END END_Lo 250
13 1 END END_Hi 310
13 2 END END_Hi 320
20 1 END END_Hi 200
20 2 END END_Hi 185
24 1 END END_Lo 260
24 2 END END_Lo 270
25 1 END END_Hi 210
25 2 END END_Hi 235
30 1 END END_Lo 250
30 2 END END_Lo 245
It think this is a case where you want to use faceting:
library(tidyverse)
Phys_Data <- data.frame(stringsAsFactors=FALSE,
Subject = c(6, 6, 9, 9, 14, 14, 26, 26, 28, 28, 29, 29, 2, 2, 16, 16, 19,
19, 27, 27, 31, 31, 32, 32, 8, 8, 13, 13, 20, 20, 24, 24, 25,
25, 30, 30),
Time = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1,
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2),
Condition = c("CET", "CET", "CET", "CET", "CET", "CET", "CET", "CET", "CET",
"CET", "CET", "CET", "RES", "RES", "RES", "RES", "RES", "RES",
"RES", "RES", "RES", "RES", "RES", "RES", "END", "END", "END",
"END", "END", "END", "END", "END", "END", "END", "END", "END"),
Response = c("CET_Hi", "CET_Hi", "CET_Lo", "CET_Lo", "CET_Hi", "CET_Hi",
"CET_Hi", "CET_Hi", "CET_Lo", "CET_Lo", "CET_Lo", "CET_Lo",
"RES_Hi", "RES_Hi", "RES_Lo", "RES_Lo", "RES_Hi", "RES_Hi",
"RES_Hi", "RES_Hi", "RES_Lo", "RES_Lo", "RES_Lo", "RES_Lo", "END_Lo",
"END_Lo", "END_Hi", "END_Hi", "END_Hi", "END_Hi", "END_Lo",
"END_Lo", "END_Hi", "END_Hi", "END_Lo", "END_Lo"),
Leg_Press = c(212, 300, 350, 370, 330, 450, 180, 250, 230, 275, 330, 325,
142, 225, 280, 320, 205, 295, 175, 260, 340, 370, 310, 370,
205, 250, 310, 320, 200, 185, 260, 270, 210, 235, 250, 245)
)
Phys_Data %>%
mutate(
Time = as.factor(Time),
Response = str_split_fixed(Response, "_", 2)[,2]
) %>%
ggplot(aes(x=Time, y=Leg_Press, fill=Time)) +
facet_wrap(~Condition, strip.position = "bottom") +
geom_col(
data = ~group_by(.x, Time, Condition) %>%
summarize(Leg_Press = mean(Leg_Press)) %>%
ungroup()
) +
scale_fill_brewer(palette="Blues", name = "Time", labels = c("Pre", "Post")) +
geom_point(aes(color=Response)) +
geom_line(aes(color=Response, group=Subject)) +
labs(title="Leg Press", x = "Condition", y ="Leg Press (kg)") +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank()
)
Created on 2019-09-04 by the reprex package (v0.3.0)
这篇关于如何将geom_bar,geom_point和geom_line合并为一个图形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!