如何调整图例属性以显示 2 个特征?
How to adjust legend properties to display 2 characteristics?
我在同一个图中绘制了两个变量,每个变量都按年份分组。我的图例按年份显示颜色差异,但我不知道如何向图例添加线型。理想情况下,图例中有 4 条线:粉色=2015,蓝色=2016,虚线=Var1,实线=Var2
这是我的样本 df:
year <- c(2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016)
month <-c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12)
Var1 <- sample(30:60, 24, rep=TRUE)
Var2 <- sample(70:90, 24, rep=TRUE)
df <- data.frame(year,month,Var1, Var2)
和情节:
plot <- ggplot(df)+
geom_line(aes(x=as.factor(month), y=Var1,
group=as.factor(year), color=as.factor(year)), linetype=2, size=0.9)+
geom_point(aes(x=as.factor(month), y=Var1, group=as.factor(year)))+
geom_line(aes(x=as.factor(month), y=Var2,
group=as.factor(year), color=as.factor(year)), linetype=1, size=0.9)+
geom_point(aes(x=as.factor(month), y=Var2, group=as.factor(year)))+
theme_tufte()+
theme(legend.title=element_blank())+
labs(x=NULL,y="",title="Var1 vs. Var2")+
scale_x_discrete(expand=c(0,0.2),
labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
plot
我试过更改 geom_line 中的 aes,以及添加和配置一些 scale_xxx_yyyy,包括 scale_linetype_manual。到目前为止都没有成功。理想情况下,我不必单独绘制我的图例,而是能够从 ggplot 中直接绘制它。
为此,我们将不得不稍微更改您的数据集。首先,我们将(从 tidyr 包中)将您的 var1 和 var2 收集在一起,这样我们就有了两个新变量,一个名为 var 的值 "var1" 和 "var2" 以及一个名为 n 的变量将具有var1 和 var2 的值。
df <- data.frame(year,month,Var1,Var2) %>%
gather("var", "n", 3:4)
然后对于 "year" X "var" 的每个组合,我们将创建一个段变量来指示我们将绘制哪条线。
- 1 年 == 2015 & var == var1
- 2 年 == 2016 & var == var1
- 3 年 == 2015 & var == var2
- 4 年 == 2016 & var == var2
像这样懒洋洋地做
df$segment <- rep(1:4, each = 12)
现在的目标就是按照线段一条一条的画线。这将通过以下循环完成
gg <- ggplot()
for (i in 1:4) gg <- gg +
geom_line(data = subset(df, segment == i),
aes(x = as.factor(month), y = n, linetype = var,
group = as.factor(year), color = as.factor(year))) +
geom_point(data = subset(df, segment == i),
aes(x = as.factor(month), y = n, group = as.factor(year)))
请注意这与您的区别在于 geom_line 有一个根据细分的子集数据集(我们只需要我们正在绘制的线的数据)。 y = n 根据我们之前所做的收集,现在我们设置了一个新的审美,这是我们的 var。循环4次,与段数相同
最后添加其他主题和实验室
gg <- gg + theme(legend.title = element_blank())+
labs(x = NULL,y = "", title = "Var1 vs. Var2")+
scale_x_discrete(expand = c(0,0.2),
labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
gg
我们得到了结果
year <- c(2015,2015,2015,2015,2015,2015,2015,2015,2015,
2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016)
month <-c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12)
Var1 <- sample(30:60, 24, rep=TRUE)
Var2 <- sample(70:90, 24, rep=TRUE)
df <- data.frame(year,month,Var1, Var2)
如果您稍微修改 data.frame 的格式并使用交互将 ggplot2
中的 2 个变量分组。干得好。我正在使用 data.table
,因为我不再知道如何将 data.frame 转换为 long。
library(data.table)
library (ggplot2)
ggplot(melt(as.data.table(df),id.vars=c("year","month")))+
geom_line(aes(x=as.factor(month),
y=value, group=interaction(variable, as.factor(year)),
color=as.factor(year),linetype=variable), size=0.9) +
labs(x = NULL,y = "", title = "Var1 vs. Var2")+
scale_x_discrete(expand = c(0,0.2),
labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
我在同一个图中绘制了两个变量,每个变量都按年份分组。我的图例按年份显示颜色差异,但我不知道如何向图例添加线型。理想情况下,图例中有 4 条线:粉色=2015,蓝色=2016,虚线=Var1,实线=Var2
这是我的样本 df:
year <- c(2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016)
month <-c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12)
Var1 <- sample(30:60, 24, rep=TRUE)
Var2 <- sample(70:90, 24, rep=TRUE)
df <- data.frame(year,month,Var1, Var2)
和情节:
plot <- ggplot(df)+
geom_line(aes(x=as.factor(month), y=Var1,
group=as.factor(year), color=as.factor(year)), linetype=2, size=0.9)+
geom_point(aes(x=as.factor(month), y=Var1, group=as.factor(year)))+
geom_line(aes(x=as.factor(month), y=Var2,
group=as.factor(year), color=as.factor(year)), linetype=1, size=0.9)+
geom_point(aes(x=as.factor(month), y=Var2, group=as.factor(year)))+
theme_tufte()+
theme(legend.title=element_blank())+
labs(x=NULL,y="",title="Var1 vs. Var2")+
scale_x_discrete(expand=c(0,0.2),
labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
plot
我试过更改 geom_line 中的 aes,以及添加和配置一些 scale_xxx_yyyy,包括 scale_linetype_manual。到目前为止都没有成功。理想情况下,我不必单独绘制我的图例,而是能够从 ggplot 中直接绘制它。
为此,我们将不得不稍微更改您的数据集。首先,我们将(从 tidyr 包中)将您的 var1 和 var2 收集在一起,这样我们就有了两个新变量,一个名为 var 的值 "var1" 和 "var2" 以及一个名为 n 的变量将具有var1 和 var2 的值。
df <- data.frame(year,month,Var1,Var2) %>%
gather("var", "n", 3:4)
然后对于 "year" X "var" 的每个组合,我们将创建一个段变量来指示我们将绘制哪条线。
- 1 年 == 2015 & var == var1
- 2 年 == 2016 & var == var1
- 3 年 == 2015 & var == var2
- 4 年 == 2016 & var == var2
像这样懒洋洋地做
df$segment <- rep(1:4, each = 12)
现在的目标就是按照线段一条一条的画线。这将通过以下循环完成
gg <- ggplot()
for (i in 1:4) gg <- gg +
geom_line(data = subset(df, segment == i),
aes(x = as.factor(month), y = n, linetype = var,
group = as.factor(year), color = as.factor(year))) +
geom_point(data = subset(df, segment == i),
aes(x = as.factor(month), y = n, group = as.factor(year)))
请注意这与您的区别在于 geom_line 有一个根据细分的子集数据集(我们只需要我们正在绘制的线的数据)。 y = n 根据我们之前所做的收集,现在我们设置了一个新的审美,这是我们的 var。循环4次,与段数相同
最后添加其他主题和实验室
gg <- gg + theme(legend.title = element_blank())+
labs(x = NULL,y = "", title = "Var1 vs. Var2")+
scale_x_discrete(expand = c(0,0.2),
labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
gg
我们得到了结果
year <- c(2015,2015,2015,2015,2015,2015,2015,2015,2015,
2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016)
month <-c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12)
Var1 <- sample(30:60, 24, rep=TRUE)
Var2 <- sample(70:90, 24, rep=TRUE)
df <- data.frame(year,month,Var1, Var2)
如果您稍微修改 data.frame 的格式并使用交互将 ggplot2
中的 2 个变量分组。干得好。我正在使用 data.table
,因为我不再知道如何将 data.frame 转换为 long。
library(data.table)
library (ggplot2)
ggplot(melt(as.data.table(df),id.vars=c("year","month")))+
geom_line(aes(x=as.factor(month),
y=value, group=interaction(variable, as.factor(year)),
color=as.factor(year),linetype=variable), size=0.9) +
labs(x = NULL,y = "", title = "Var1 vs. Var2")+
scale_x_discrete(expand = c(0,0.2),
labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))