R语言 ggplot2中结合条形图和线形图
有时在处理分层数据时,我们需要将两个或更多的不同类型的图表组合成一个图表,以便更好地进行可视化和分析。这些被称为 “组合图”。在这篇文章中,我们将看到如何使用ggplot2在R编程语言中结合柱状图和折线图。
使用的数据集: 售出课程与注册学生的对比
年份 | 出售的课程 | 注册学生的百分比 |
---|---|---|
2014 | 35 | 30% |
2015 | 30 | 25% |
2016 | 40 | 30% |
2017 | 25 | 50% |
2018 | 30 | 40% |
2019 | 35 | 20% |
2020 | 65 | 60% |
为了在R中绘制条形图,我们使用函数 geom_bar( ) 。
语法
geom_bar(stat, fill, color, width)
参数 :
- stat : 设置stat参数以确定模式。
- fill : 代表条形图内部的颜色。
- color : 代表条形图轮廓的颜色。
- width(宽度)。代表条形图的宽度。
另外,使用函数 geom_line( ) 可以绘制线图。
语法
geom_line(mapping=NULL, data=NULL, stat="identity", position="identity", ...)
例子
# Entering data
year <- c(2014, 2015, 2016, 2017, 2018, 2019,2020)
course <- c(35, 30, 40, 25, 30, 35, 65)
penroll <- c(0.3, 0.25, 0.3, 0.5, 0.4, 0.2, 0.6)
# Creating Data Frame
perf <- data.frame(year, course, penroll)
head(perf)
# Plotting Multiple Charts
library(ggplot2)
ggplot(perf) +
geom_bar(aes(x=year, y=course),stat="identity", fill="cyan",colour="#006000")+
geom_line(aes(x=year, y=penroll),stat="identity",color="red")+
labs(title= "Courses vs Students Enrolled in GeeksforGeeks",
x="Year",y="Number of Courses Sold")
输出
在上面的图表中,我们可以观察到柱状图的形状和预期的一样,但线状图只是可见。这是由于缩放因素造成的,因为线图是以小数形式表示的学生百分比,而当前的纵轴有很大的数值。因此,我们需要一个次要的轴,以便在同一图表区域内正确地绘制直线。
由于缩放的问题,我们必须使用ggplot2包中的R函数scale_y_continuous( )。另外,另一个函数 sec_axis( ) 被用来添加一个次要的轴,并将规格分配给它。
语法
sec_axis(trans,name,break,labels,guide)
参数:
- trans : 需要进行转换的公式或函数。
- name : 二级轴的名称。
由于我们要处理的是二级Y轴,所以我们需要在 scale_y_continuous( ) 中写下这个命令。
语法
scale_y_continuous(name,labs,position,sec.axis,limit,break)
在处理二级轴的时候,缩放系数是最棘手的部分。由于二级轴需要以百分比为单位,我们必须使用 0.01的比例系数 ,并在 sec_axis( ) 的trans参数中写入转换公式 。 如果你在公式中使用了0.01的比例,你也必须在 geom_line( ) 中把同一轴乘以100,以使比例平衡。
例子
# Entering data
year <- c(2014, 2015, 2016, 2017, 2018, 2019,2020)
course <- c(35, 30, 40, 25, 30, 35, 65)
penroll <- c(0.3, 0.25, 0.3, 0.5, 0.4, 0.2, 0.6)
# Creating Data Frame
perf <- data.frame(year, course, penroll)
# Plotting Charts and adding a secondary axis
library(ggplot2)
ggp <- ggplot(perf) +
geom_bar(aes(x=year, y=course),stat="identity", fill="cyan",colour="#006000")+
geom_line(aes(x=year, y=100*penroll),stat="identity",color="red",size=2)+
labs(title= "Courses vs Students Enrolled in GeeksforGeeks",
x="Year",y="Number of Courses Sold")+
scale_y_continuous(sec.axis=sec_axis(~.*0.01,name="Percentage"))
ggp
输出
正如我们在上面看到的那样,添加的二级轴将是分数值的形式。但我们需要的是百分比形式的二级轴。为了转换为百分比,我们必须使用 sec_axis( ) 里面的参数标签。
使用的一些重要的关键字是 。
- scale: 它用于缩放数据。一个比例系数乘以原始数据值。
- labels : 它用于分配标签。
使用的函数是 scale_y_continuous( ) ,它是ggplot2库中 “y-aesthetics “的一个默认比例。由于我们需要在Y轴的标签中加入 “百分比”,所以使用了关键词 “标签 “。
现在使用下面的命令,将Y轴的标签转换成百分比。
scales : : percent
这将简单地把Y轴的数据从十进制转换成百分比。它将现值乘以100。缩放系数是100。
例子
# Entering data
year <- c(2014, 2015, 2016, 2017, 2018, 2019,2020)
course <- c(35, 30, 40, 25, 30, 35, 65)
penroll <- c(0.3, 0.25, 0.3, 0.5, 0.4, 0.2, 0.6)
# Creating Data Frame
perf <- data.frame(year, course, penroll)
# Plotting Multiple Charts and changing
# secondary axis to percentage
library(ggplot2)
ggp <- ggplot(perf) +
geom_bar(aes(x=year, y=course),stat="identity", fill="cyan",colour="#006000")+
geom_line(aes(x=year, y=100*penroll),stat="identity",color="red",size=2)+
labs(title= "Courses vs Students Enrolled in GeeksforGeeks",
x="Year",y="Number of Courses Sold")+
scale_y_continuous(sec.axis=sec_axis(
~.*0.01,name="Percentage of Students Enrolled", labels=scales::percent))
ggp
输出