R语言——条形图数据可视化的多种方式

本文章将会介绍如何使用R语言中的ggplot2包使用条形图进行数据可视化。将会使用一个“生产企业原材料的订购与运输”的订单数据,该数据来自2021数学建模国赛C题。

某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料总体可分为 A B C 三种类型。该企业每年按48周安排生产需要提前制定24周的原材料订购和转运计划,即根据产能要求确定需要订购的原材料供应商(称为供应商和相应每周的原材料订购数量(称为订货量确定第三方物流公司(称为转运商并委托其将供应商每周的原材料供货数量(称为供货量)转运到企业仓库。附件1给出了该企业近5年402家原材料供应商的订货量和供货量数据。根据附件1对402家供应商的供货特征进行量化分析。下面将会主要使用附件1的数据,利用ggplot2包进行条形图可视化。

1 数据读取和预处理操作

建立决策数据分类模型时,使用预处理好的泰坦尼克数据集,预处理好的数据使用下面的方式进行数据切分:

library(ggplot2)
## 设置ggplot2在可视化时的一些基本情况
theme_set(theme_bw(base_family = "STKaiti")+theme(plot.title = element_text(hjust = 0.5)))
## 读取附件一的数据并进行简单的预处理
library(readxl)
library(tidyverse)
library(RColorBrewer)
GHdata1 <- read_excel("附件1 近5年402家供应商的相关数据.xlsx",sheet = "供应商的供货量(m³)")
DHdata1 <- read_excel("附件1 近5年402家供应商的相关数据.xlsx",sheet = "企业的订货量(m³)")
## 数据分组计算
## 计算近5年402家供应商所有的供货量总和
Hdata5sum <- GHdata1[,1:2]
Hdata5sum$GHnumber <- rowSums(GHdata1[,3:242])
## 计算近5年402家供应商的企业的订货量总和
Hdata5sum$DHnumber <- rowSums(DHdata1[,3:242])head(Hdata5sum)
## # A tibble: 6 x 4
##   供应商ID 材料分类 GHnumber DHnumber
##   <chr>    <chr>       <dbl>    <dbl>
## 1 S001     B              49      231
## 2 S002     A             273      309
## 3 S003     C           13138    14279
## 4 S004     B              64      713
## 5 S005     A            6912     6538
## 6 S006     C              30      462

2 条形图数据可视化

(1)可视化图像1:使用条形图只可视化数量较多的50个供应商数据,运行下面程序后可获得可视化图像图1。

## 只可视化数量较多的50个供应商数据
GHtop50 <- Hdata5sum%>%arrange(desc(GHnumber))%>%slice(1:50)
## 条形图可视化
ggplot(GHtop50 ,aes(x = reorder(供应商ID,-GHnumber), y = GHnumber))+geom_bar(aes(fill = 材料分类),stat = "identity")+theme(axis.text.x = element_text(angle = 90,vjust = 0.5))+labs(x = "供应商",y = "供货量",title = "5年来供货量较多的供应商")

(2)可视化图像2:针对使用条形图可视化得到的图像1,可以使用分面对其进一步的分组可视化,运行下面程序后可获得可视化图像图2。

## 使用分面图进行可视化
ggplot(GHtop50 ,aes(x = reorder(供应商ID,GHnumber), y = GHnumber))+geom_bar(aes(fill = 材料分类),stat = "identity")+coord_flip()+facet_wrap(vars(材料分类), scales = "free_y",nrow = 1)+labs(x = "供应商",y = "供货量",title = "5年来供货量较多的供应商")

(3)可视化图像3:针对供货量和订货量的整体情况,可以使用金字塔分组条形图进行可视化,运行下面程序后可获得可视化图像图3。

## DHtop50的订货量和供货量差异
ggplot()+geom_bar(data = DHtop50 ,aes(x = reorder(供应商ID,-DHnumber),y = DHnumber,fill = "订货"),stat = "identity")+geom_bar(data = DHtop50,aes(x = reorder(供应商ID,-DHnumber),y = -GHnumber,fill = "供货"),stat = "identity")+scale_y_continuous(labels = abs, limits = c(-500000,500000))+theme(axis.text.x = element_text(angle = 90,vjust = 0.5))+scale_fill_manual("方式",values = c("订货" = "red","供货" = "blue"))+labs(x = "供应商",y = "定货量",title = "5年来企业定货量和供应商供货量差异")

(4)可视化图像4:针对供货量和订货量的差异情况,可以使用分组条形图进行可视化,运行下面程序后可获得可视化图像图4。

## 可视化供货和订货差异较大的一些企业
Hdata5sum$chayi <- Hdata5sum$DHnumber - Hdata5sum$GHnumber
chayitop50 <- Hdata5sum%>%arrange(desc(chayi))%>%slice(1:50)
chayitop50
## # A tibble: 50 x 5
##    供应商ID 材料分类 GHnumber DHnumber  chayi
##    <chr>    <chr>       <dbl>    <dbl>  <dbl>
##  1 S201     A           81989   348699 266710
##  2 S140     B          302047   481103 179056
##  3 S126     C           47540   132285  84745
##  4 S348     A           92421   167109  74688
##  5 S151     C          194498   266510  72012
##  6 S160     C              45    62688  62643
##  7 S308     B          136998   186278  49280
##  8 S330     B          136652   172980  36328
##  9 S157     A             395    33284  32889
## 10 S108     B          240950   271445  30495
## # … with 40 more rows
## 可视化
ggplot(chayitop50 ,aes(x = reorder(供应商ID,chayi), y = chayi))+geom_bar(aes(fill = 材料分类),stat = "identity")+coord_flip()+facet_wrap(vars(材料分类), scales = "free_y",nrow = 1)+labs(x = "供应商",y = "定货量-供货量",title = "5年来缺货较多的供应商")

(5)可视化图像5:针对供货量较多的50个供货商的数据,可以使用经过极坐标变换的分组条形图进行可视化,运行下面程序后可获得可视化图像图5。

## 在每个分组数据的后面插入几行缺失值
GHtop50$材料分类 <- as.factor(GHtop50$材料分类)
empty_bar <- 3
to_add <- data.frame(matrix(NA, empty_bar*nlevels(GHtop50$材料分类),ncol(GHtop50)))
colnames(to_add) <- colnames(GHtop50) # 设置数据表的名称
#为数据表添加分组变量
to_add$材料分类 <- rep(levels(GHtop50$材料分类), each=empty_bar)
GHtop50 <- rbind(GHtop50, to_add) # 合并两个数据
GHtop50 <- GHtop50 %>% arrange(材料分类) # 将数据根据分组进行排序
GHtop50$id <- seq(1, nrow(GHtop50))
# 获取每个样本的名称在y轴的位置和倾斜角度
label_data <- GHtop50
number_of_bar <- nrow(label_data) # 计算条的数量
## 每个条上标签的轴坐标的倾斜角度
angle <- 90 - 360 * (label_data$id-0.5) /number_of_bar
label_data$hjust <- ifelse( angle < -90, 1, 0) # 调整标签的对其方式
label_data$angle <- ifelse(angle < -90, angle+180, angle) ## 标签倾斜角度
## 为数据准备基础弧线的数据
base_data <- GHtop50 %>% group_by(材料分类) %>%summarize(start=min(id), end=max(id) - empty_bar) %>%rowwise() %>% mutate(title=mean(c(start, end)))
## 可视化分组圆环条形图
p1 <- ggplot(GHtop50)+## 添加条形图geom_bar(aes(x=as.factor(id), y=GHnumber, fill=材料分类),stat="identity",alpha=0.8) +## 添加文本表示每条线的大小annotate("text", x = rep(max(GHtop50$id),3), y = c(100000, 200000, 300000),label = c("100000", "200000", "300000") , color="blue", size=3,angle=0, fontface="bold", hjust=1) +ylim(-200000,400000) + ## 设置y轴坐标表的取值范围,可流出更大的圆心空白## 设置使用的主题并使用极坐标系可视化条形图theme_minimal() +theme(legend.position = "none", # 不要图例axis.text = element_blank(),# 不要x轴的标签axis.title = element_blank(), # 不要坐标系的名称panel.grid = element_blank(), # 不要网格线plot.margin = unit(rep(-1,4), "cm"))+ ## 整个图与周围的边距coord_polar() + ## 极坐标系## 为条形图添加文本geom_text(data=label_data,aes(x=id, y=GHnumber+2000, label=供应商ID,hjust=hjust),color="black",fontface="bold",alpha=0.8, size=2.5,angle= label_data$angle, inherit.aes = FALSE) +# 为图像添加基础线的信息geom_segment(data=base_data, aes(x = start, y = -10000,xend = end, yend = -10000),colour = "black", alpha=0.8, size=0.6 , inherit.aes = FALSE )+## 添加分组文本信息geom_text(data=base_data, aes(x = title, y = -50000,label=材料分类),alpha=0.8,colour = "black", size=4,fontface="bold", inherit.aes = FALSE)
p1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496725.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cyber RT 参数

以共享的方式实现不同节点之间数据交互的通信模式。 参数服务器是基于服务实现的&#xff0c;包含客户端和服务器端&#xff0c;服务端节点可以存储数据&#xff0c;客户端节点可以访问服务端节点操作数据&#xff0c;这个过程虽然基于请求响应的&#xff0c;但是无需自己实现…

2024年阿里云优惠券领取及使用教程_无门槛优惠券

阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff1a; 阿里云优惠券…

亚信安慧AntDB助力全链路实时化

实时数据平台&#xff0c;快速实现企业全链路实时化 引入数据仓库、数据挖掘、HTAP等先进理念&#xff0c;通过实时数据应用平台来装载庞大的信息量&#xff0c;进行实时分析处理&#xff0c;克服数据处理过程中的困难&#xff0c;是当下各企事业单位、互联网、金融&#xff0c…

嵌入式学习 Day 26

数组指针和指针数组 &#xff08;题外话&#xff09; 数组指针&#xff1a;数组指针是一种指针&#xff0c;它指向一个数组的首地址。在C语言中&#xff0c;数组名本身就是一个指向数组首地址的指针&#xff0c;因此数组名可以被赋值给指针变量&#xff0c…

LeetCode59. 螺旋矩阵 II(C++)

LeetCode59. 螺旋矩阵 II 题目链接代码 题目链接 https://leetcode.cn/problems/spiral-matrix-ii/ 代码 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0));int startx …

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

java常用应用程序编程接口(API)——Date,SimpleDateFormat,Calendar概述

前言&#xff1a; 时间和日期在程序中还是非常重要的&#xff0c;需要牢牢掌握。打好基础&#xff0c;daydayup! Date 代表的是日期和时间 Date的使用方式 1&#xff0c;创建对象&#xff0c;调用无参数构造器初始化对象&#xff1a;public Date(); &#xff08;创建一个Date对…

express+mysql+vue,从零搭建一个商城管理系统6--数据校验和登录

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、修改models/user.js二、修改routes下的user.js三、Api新建user/login接口四、删除数据库原有数据&#xff0c;添加新验证规则的用户四、用户登录总结 前言 需求&#xff1a;主要学习express&#xff0c;…

springboot226经方药食两用服务平台

经方药食两用服务平台的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定经方药食两用…

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…

接口测试的测试要点

接口测试的测试要点&#xff0c;你知道都有哪些吗&#xff1f; 接口测试是软件测试中的重要组成部分&#xff0c;它的目的是评估接口的质量和可靠性&#xff0c;以保证系统的正常运行。在进行接口测试时&#xff0c;必须要考虑到以下几个方面&#xff1a; 测试用例的编写 测试…

基于HT32的智能家居demo(蓝牙上位机)

参加合泰杯作品的部分展示&#xff0c;基于HT32的智能家居&#xff0c;这里展示灯光的相关控制&#xff0c;是用蓝牙进行的数据透传&#xff0c;参考了一些资料&#xff0c;美化封装了一下之前的上位机界面。 成果展示 点击主界面的蓝牙设置&#xff0c;进行连接&#xff0c;下…