ggplot2:在 y 轴上有两个变量(以相同比例测量)的散点图:如何改变美学并添加单独的回归线?
ggplot2: scatterplot with two variables (measured on the same scale) on the y-axis: how do I change the aesthetics & add seperate regression lines?
为了我的论文,我在 R 中以 APA 格式制作散点图。
到目前为止,我的代码如下,它非常适合只绘制一个具有置信区间和回归线的变量:
scatterplot=ggplot(dat, aes(x=STAIT, y=valence))+
geom_point()+
geom_smooth(method=lm,se=T, fullrange=T,colour='black')+
labs(x='STAI-T score', y='Report length')+
apatheme
但是,我有两个变量最初是在相同的 0-100 范围内测量的:效价和唤醒度。我认为将两个变量添加到一个图中会很好,而不是两个单独的图,使用 'valence/arousal score' 作为 ylab 和 open/closed 点来定义哪些数据点来自哪个变量,有点像在 this example I found online。
然而,在该示例中,数据来自不同的组。所以该代码不适用于我的数据。
我尝试了不同的东西,最接近的是使用以下代码:
sp.both=ggplot(dat, aes(x=STAIT))+
geom_point(aes(y=valence)) +
geom_point(aes(y=arousal)) +
apatheme
这为我提供了一个散点图,其中包含添加到同一图中的两个变量的数据点。
但是,我需要一个分数的数据点在视觉上与另一个分数不同,并且我想为每个变量添加两条单独的回归线。但是到目前为止,我尝试过的所有方法都导致了错误,而且我无法在网上找到任何尝试做同样事情的人的例子。
非常感谢任何帮助!
使用一些随机示例数据,您可以像这样实现您的期望:
最好将数据重塑为长格式,例如使用tidyr::pivot_longer
这给了我们两个新的列,一个是变量的名称,另一个是相应的值。重塑后,您可以在 y 上映射值并通过在 shape
和 linetype
:
上映射变量列来设置不同的形状和线型
library(ggplot2)
library(tidyr)
set.seed(42)
dat <- data.frame(
STAIT = runif(20, 0, 1),
valence = runif(20, 0, 1),
arousal = runif(20, 0, 1)
)
dat_long <- dat %>%
pivot_longer(c(valence, arousal), names_to = "var", values_to = "value")
ggplot(dat_long, aes(x = STAIT, y = value, linetype = var, shape = var)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "black", size = .5)
#> `geom_smooth()` using formula 'y ~ x'
我想出了一个办法,代码如下:
sp.both = ggplot(dat,aes(x=STAIT)) +
geom_point(shape = 16, aes(y=arousal)) +
geom_point(shape = 1, aes(y=valence)) +
labs(x='STAI-T score', y= 'valence/arousal score')+
geom_smooth(method=lm,se=T,fullrange=T,colour='black',aes(y=arousal))+
geom_smooth(method=lm,se=T,fullrange=T,linetype ='dashed',colour='black',aes(y=valence))+
apatheme
我唯一还没有弄清楚的是现在如何添加带有线型 (solid/dashed) 和相应数据点 (solid/open) 及其所属变量的图例到。
但是 Stefan 的例子解决了这个问题,我更喜欢情节在视觉上看起来的方式。所以这绝对是解决这个问题的更好方法。谢谢!
为了我的论文,我在 R 中以 APA 格式制作散点图。 到目前为止,我的代码如下,它非常适合只绘制一个具有置信区间和回归线的变量:
scatterplot=ggplot(dat, aes(x=STAIT, y=valence))+
geom_point()+
geom_smooth(method=lm,se=T, fullrange=T,colour='black')+
labs(x='STAI-T score', y='Report length')+
apatheme
但是,我有两个变量最初是在相同的 0-100 范围内测量的:效价和唤醒度。我认为将两个变量添加到一个图中会很好,而不是两个单独的图,使用 'valence/arousal score' 作为 ylab 和 open/closed 点来定义哪些数据点来自哪个变量,有点像在 this example I found online。 然而,在该示例中,数据来自不同的组。所以该代码不适用于我的数据。 我尝试了不同的东西,最接近的是使用以下代码:
sp.both=ggplot(dat, aes(x=STAIT))+
geom_point(aes(y=valence)) +
geom_point(aes(y=arousal)) +
apatheme
这为我提供了一个散点图,其中包含添加到同一图中的两个变量的数据点。 但是,我需要一个分数的数据点在视觉上与另一个分数不同,并且我想为每个变量添加两条单独的回归线。但是到目前为止,我尝试过的所有方法都导致了错误,而且我无法在网上找到任何尝试做同样事情的人的例子。
非常感谢任何帮助!
使用一些随机示例数据,您可以像这样实现您的期望:
最好将数据重塑为长格式,例如使用tidyr::pivot_longer
这给了我们两个新的列,一个是变量的名称,另一个是相应的值。重塑后,您可以在 y 上映射值并通过在 shape
和 linetype
:
library(ggplot2)
library(tidyr)
set.seed(42)
dat <- data.frame(
STAIT = runif(20, 0, 1),
valence = runif(20, 0, 1),
arousal = runif(20, 0, 1)
)
dat_long <- dat %>%
pivot_longer(c(valence, arousal), names_to = "var", values_to = "value")
ggplot(dat_long, aes(x = STAIT, y = value, linetype = var, shape = var)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "black", size = .5)
#> `geom_smooth()` using formula 'y ~ x'
我想出了一个办法,代码如下:
sp.both = ggplot(dat,aes(x=STAIT)) +
geom_point(shape = 16, aes(y=arousal)) +
geom_point(shape = 1, aes(y=valence)) +
labs(x='STAI-T score', y= 'valence/arousal score')+
geom_smooth(method=lm,se=T,fullrange=T,colour='black',aes(y=arousal))+
geom_smooth(method=lm,se=T,fullrange=T,linetype ='dashed',colour='black',aes(y=valence))+
apatheme
我唯一还没有弄清楚的是现在如何添加带有线型 (solid/dashed) 和相应数据点 (solid/open) 及其所属变量的图例到。 但是 Stefan 的例子解决了这个问题,我更喜欢情节在视觉上看起来的方式。所以这绝对是解决这个问题的更好方法。谢谢!