柱状图+折线图+双Y-axis [R ggplot2]

本文介绍了如何使用R语言的ggplot2包创建组合条形图和折线图,用于可视化分层数据。通过示例展示了如何使用geom_bar()绘制条形图,geom_line()绘制折线图,并通过调整Y轴区间和添加次轴来处理不同比例的数据。同时,还演示了如何添加误差棒(ErrorBar)以显示标准差,以及如何美化图表。
摘要由CSDN通过智能技术生成

前言

😑有时,在处理分层数据时,我们需要将两种或多种不同的图表类型组合成一个图,以便更好地进行可视化和分析。这些被称为“组合图”。本文中,将使用ggplot2【R】实现组合条形图和折线图。实现类似下图效果:(不要在意马赛克)

在这里插入图片描述

😑使用geom_bar() 实现柱状图,使用方法:

Syntax:geom_bar(stat, fill, color, width)
Parameters :

stat : Set the stat parameter to identify the mode.
fill : Represents color inside the bars.
color : Represents color of outlines of the bars.
width : Represents width of the bars.

😑使用geom_line() 实现折线图,使用方法:

Syntax:geom_line(mapping=NULL, data=NULL, stat=”identity”, position=”identity”,…)

准备数据

year <- c(2016, 2017, 2018, 2019, 2020, 2021,2022)
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)

# 创建 Data Frame
```r
perf <- data.frame(year, course, penroll)
perf
###
  year   course penroll
1 2016   35     0.30
2 2017   30     0.25
3 2018   40     0.30
4 2019   25     0.50
5 2020   30     0.40
6 2021   35     0.20
7 2022   65     0.60

先试一下

library(ggplot2)

ggplot(perf) +
  geom_bar(aes(x=year, y=course),
           stat="identity", fill="black",
           colour="#006000") +
  geom_line(aes(x=year, y=penroll),
            stat="identity", color="white") +
  labs(title= "Courses vs Students Enrolled in GeeksforGeeks",
       x="Year", y="Number of Courses Sold")

😑下图,可以看到条形图的形状与预期相符,但直线图只是可见的。这是由于比例造成的,折线图表示百分比,以十进制表示,而当前Y-axis 的值非常大。因此,我们需要一个次轴(另一个Y-axis ),以便在同一图表区域中正确地展示折线。需要使用ggplot2中的scale_y_continuous() 调整Y轴区间;使用sec_axis()添加次轴(另一个Y-axis)。

在这里插入图片描述

调整

ggp <- ggplot(perf) + 
  geom_bar(aes(x=year, y=course),
           stat="identity",
           fill="black") +
  geom_line(aes(x=year, y=100*penroll),
            stat="identity",
            color="red",
            size=2) +
  labs(title= "Title",
       x="Year",
       y="Number") +
  scale_y_continuous(sec.axis=sec_axis(~.*0.01, name="Percentage", labels=scales::percent))

ggp + theme_classic()

在这里插入图片描述

Error Bar 怎么办 ?

😑这时需要Standard Deviation ( SD ),下面随便添加的,实际需要计算,使用geom_errorbar() 实现:

# 添加sd值
perf$sd <- c(2,0.8,5.3,4.2,3.1,1.7,1)

# 画图

ggp <- ggplot(perf) + 
  geom_bar(aes(x=year, y=course),
           stat="identity",
           fill="skyblue") +
  geom_errorbar(
    aes(x=year, ymin=course-sd, ymax=course+sd),
    width=0.4, 
    colour="orange", 
    alpha=0.9, 
    size=1.3) +
  geom_line(aes(x=year, y=100*penroll),
            stat="identity",
            color="black",
            size = 0.8) +
  geom_point(aes(x=year, y=100*penroll), size = 2) +
  labs(title= "Title",
       x="Year",
       y="Number") +
  scale_y_continuous(sec.axis=sec_axis(~.*0.01, name="Percentage", labels=scales::percent))

ggp + theme_classic()

在这里插入图片描述

😑其实还是差一些意思的,看起来也就那样吧……以后如果用得上,再美化吧……

欢迎关注:猪猪的乌托邦

在这里插入图片描述

首先需要准备好数据,例如下面的数据: ```javascript // 柱状图数据 var barData = [ { name: 'A', type: 'bar', data: [10, 20, 30, 40, 50] }, { name: 'B', type: 'bar', data: [20, 30, 40, 50, 60] }, { name: 'C', type: 'bar', data: [30, 40, 50, 60, 70] } ]; // 折线图数据 var lineData = [ { name: 'D', type: 'line', data: [20, 30, 40, 50, 60] }, { name: 'E', type: 'line', data: [30, 40, 50, 60, 70] }, { name: 'F', type: 'line', data: [40, 50, 60, 70, 80] } ]; ``` 然后,创建一个 ECharts 实例,并配置图表的基本属性: ```javascript // 创建 ECharts 实例 var myChart = echarts.init(document.getElementById('chart')); // 配置图表基本属性 var option = { title: { text: '多柱状图折线图' }, tooltip: { trigger: 'axis' }, legend: { data: ['A', 'B', 'C', 'D', 'E', 'F'] }, grid: { top: 70, bottom: 50 }, xAxis: { type: 'category', data: ['Jan', 'Feb', 'Mar', 'Apr', 'May'] }, yAxis: { type: 'value' } }; ``` 接下来,将柱状图数据和折线图数据添到 option 中: ```javascript option.series = barData.concat(lineData); ``` 最后,将 option 应用到 ECharts 实例中即可: ```javascript myChart.setOption(option); ``` 完整代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>多柱状图折线图</title> <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/echarts-stat/dist/ecStat.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/dataTool.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js"></script> <script src="https://cdn.jsdelivr.net/npm/echarts/map/js/world.js"></script> </head> <body> <div id="chart" style="height: 500px;"></div> <script> // 柱状图数据 var barData = [ { name: 'A', type: 'bar', data: [10, 20, 30, 40, 50] }, { name: 'B', type: 'bar', data: [20, 30, 40, 50, 60] }, { name: 'C', type: 'bar', data: [30, 40, 50, 60, 70] } ]; // 折线图数据 var lineData = [ { name: 'D', type: 'line', data: [20, 30, 40, 50, 60] }, { name: 'E', type: 'line', data: [30, 40, 50, 60, 70] }, { name: 'F', type: 'line', data: [40, 50, 60, 70, 80] } ]; // 创建 ECharts 实例 var myChart = echarts.init(document.getElementById('chart')); // 配置图表基本属性 var option = { title: { text: '多柱状图折线图' }, tooltip: { trigger: 'axis' }, legend: { data: ['A', 'B', 'C', 'D', 'E', 'F'] }, grid: { top: 70, bottom: 50 }, xAxis: { type: 'category', data: ['Jan', 'Feb', 'Mar', 'Apr', 'May'] }, yAxis: { type: 'value' } }; // 将柱状图数据和折线图数据添到 option 中 option.series = barData.concat(lineData); // 应用 option 到 ECharts 实例中 myChart.setOption(option); </script> </body> </html> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值