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.mzph.cn/news/707224.shtml

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

相关文章

【C++那些事儿】深入理解C++类与对象:从概念到实践(上)| 揭开this指针的神秘面纱

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C那些事儿 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 1. 面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符…

【蓝桥杯】快读|min和max值的设置|小明和完美序列|​顺子日期​|星期计算|山

目录 一、输入的三种方式 1.最常见的Scanner的输入方法 2.数据多的时候常用BufferedReader快读 3.较麻烦的StreamTokenizer快读&#xff08;用的不多&#xff09; StreamTokenizer常见错误&#xff1a; 二、min和max值的设置 三、妮妮的翻转游戏 四、小明和完美序列 五…

AI引擎助力,CamScanner智能高清滤镜开启扫描新纪元!

文章目录 ⭐ 写在前面⭐ 突破图像处理难点&#xff1a;扫描全能王的独特优势⭐ 耳听为虚&#xff0c;眼见为实⭐ 产品背后的主要核心&#xff1a;AI-Scan助力⭐ 深度学习助力智能文档处理的国际化进程⭐ 品味智能文档处理的轻松与精准 ⭐ 写在前面 在数字化快速发展的今天&…

MySQL 篇-深入了解 DML、DQL 语言(二)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 DML、DQL 语言说明 2.0 使用 DML 实现对数据管理和操作 2.1 DML - 增添数据 insert 2.2 DML - 修改数据 update 2.3 DML - 删除数据 delete 3.0 使用 DQL 实现对…

数据界的达克摩斯之剑----深入浅出带你理解网络爬虫(Forth)

目录 3.爬虫身份识别 4.用户爬虫的例子 4.1 开源爬虫 网络爬虫的组成 控制器 解析器 资源库 3.爬虫身份识别 网络爬虫通过使用http请求的用户代理&#xff08;User Agent&#xff09;字段来向网络服务器表明他们的身份。网络管理员则通过检查网络服务器的日志&#xff0…

77. 组合(力扣LeetCode)

文章目录 77. 组合题目描述回溯算法组合问题的剪枝操作 77. 组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4],…

ArcgisForJS如何将ArcGIS Server发布的点要素渲染为热力图?

文章目录 0.引言1.ArcGIS创建点要素2.ArcGIS Server发布点要素3.ArcgisForJS将ArcGIS创建的点要素渲染为热力图 0.引言 ArcGIS For JS 是一个强大的地理信息系统&#xff08;GIS&#xff09;工具&#xff0c;它允许开发者使用 JavaScript 语言来创建各种 GIS 应用。ArcGIS Ser…

DolphinScheduler——介绍及架构设计

目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…

音频混音算法的实现

最近项目有用到混音算法&#xff0c;这里用比较常见的一种&#xff0c;就是简单的加和之后做一下归一化。 是参考这个博主实现的&#xff1a; 音频混音的算法实现 下面直接贴代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <math.h&…

Python学习 day05(异常、模块导入)

异常 为什么要捕获异常 当程序遇到了BUG&#xff0c;如果不对BUG进行手动捕获&#xff0c;那么整个程序就会因为一个BUG而停止运行&#xff0c;这在有些情况下是会造成很大的损失&#xff0c;但是如果我们进行了手动捕获&#xff0c;那么整个程序会继续运行捕获异常的作用在于&…

vue-router4 (六) 命名视图

命名视图可以使得同一级&#xff08;同一个组件&#xff09;中展示更多的路由视图&#xff0c;而不是嵌套显示&#xff0c; 命名视图可以让一个组件中具有多个路由渲染出口&#xff0c;这对于一些特定的布局组件非常有用。 应用场景&#xff1a; 比如点击login切换到组件A&am…

vue3第三节(v-model 执行原理)

特殊说明&#xff1a; 以下vue3语法是基于 3.4之前版本进行使用的&#xff0c;3.4之后的版本 引入了 defineModel 宏&#xff0c;后续会介绍defineModel 1、vue3 与vue2 中v-model区别 vue3 中v-model绑定的不再是value&#xff0c;而是modelValue&#xff0c;接收的方法也不再…

2024-02-28(Kafka,Oozie,Flink)

1.Kafka的数据存储形式 一个主题由多个分区组成 一个分区由多个segment段组成 一个segment段由多个文件组成&#xff08;log&#xff0c;index&#xff08;稀疏索引&#xff09;&#xff0c;timeindex&#xff08;根据时间做的索引&#xff09;&#xff09; 2.读数据的流程 …

论文精读--GPT3

不像GPT2一样追求zero-shot&#xff0c;而换成了few-shot Abstract Recent work has demonstrated substantial gains on many NLP tasks and benchmarks by pre-training on a large corpus of text followed by fine-tuning on a specific task. While typically task-agnos…

Day04:APP架构小程序H5+Vue语言Web封装原生开发Flutter

目录 常见APP开发架构 APP-开发架构-原生态-IDEA APP-开发架构-Web封装-平台 APP-开发架构-H5&Vue-HBuilderX WX小程序-开发架构-Web封装-平台 WX小程序-开发架构-H5&Vue-HBuilderX 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服…

Leetcode—82. 删除排序链表中的重复元素 II【中等】

2024每日刷题&#xff08;117&#xff09; Leetcode—82. 删除排序链表中的重复元素 II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…

在Golang中简化日志记录:提升性能和调试效率

最大化效率和有效故障排除&#xff1a;在Golang中简化日志记录 日志记录是软件开发的一个基本方面&#xff0c;有助于调试、监控和理解应用程序的流程。在Golang中&#xff0c;有效的日志记录实践可以显著提高性能并简化调试过程。本文探讨了优化Golang日志记录的技术&#xf…

服务器数据恢复-异常断电导致服务器硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; dell某型号服务器中有一组通过raid卡组建的raid10&#xff0c;该raid阵列中一共有4块磁盘。上层部署XenServer虚拟化平台&#xff0c;作为网站服务器使用。 服务器故障&#xff1a; 服务器异常断电导致服务器上的一台虚拟机不可用。需要恢复这…

Java Web(八)--Servlet(二)

Servlet API Servlet API 包含以下4个Java包&#xff1a; 1. javax.servlet&#xff1a;其中包含定义Servlet和Servlet容器之间契约的类和接口。 2. javax.servlet.http&#xff1a;主要定义了与HTTP协议相关的HttpServlet类&#xff0c;HttpServletRequest接口和HttpServl…

C语言第三十二弹---自定义类型:联合和枚举

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、联合体 1.1、联合体类型的声明 1.2、联合体的特点 1.3、相同成员的结构体和联合体对比 1.4、联合体大小的计算 1.5、联合的⼀个练习 2、枚举类型 …