R语言学习 case2:人口金字塔图

step1:导入库

library(ggplot2)
library(ggpol)
library(dplyr)

step2:读取数据

data <- readxl::read_xlsx("data_new.xlsx", sheet = 1)
data
  • readxl::read_xlsx() 是 readxl 包中的函数,用于读取Excel文件。

step3:数据转换

mydata <- data %>% select(1, 3, 4) %>% reshape2::melt(id.vars = "Group", variable.name = "Sex", value.name = "Prop")
  • mydata <- data %>% select(1, 3, 4):select(1, 3, 4) 选择数据框 data 中的第1列、第3列和第4列。
  • %>% reshape2::melt(id.vars = "Group", variable.name = "Sex", value.name = "Prop")
  • reshape2::melt() 函数用于将数据框从宽格式(wide format)转换为长格式(long format),这样更容易进行分析和可视化
  • id.vars = "Group" 指定 “Group” 列作为标识变量,即不进行融化的列。
  • variable.name = "Sex"指定新生成的列的名称,该列包含了之前选择的列的列名(在这里是 “Sex”)。

step4:对称显示,取一半设置为负

mydata$Prop <- ifelse(mydata$Sex == "Male", mydata$Prop * -1, mydata$Prop)
  • ifelse(mydata$Sex == "Male", mydata$Prop * -1, mydata$Prop)

  • mydata$Sex == "Male" 是一个条件表达式,检查 “Sex” 列是否等于 “Male”。
    如果条件为真,即 “Sex” 列的值是 “Male”,则执行 mydata$Prop * -1,将 “Prop” 列的值乘以 -1。如果条件为假,即 “Sex” 列的值不是 “Male”,则保持 “Prop” 列的值不变。
    ifelse() 函数将根据条件逐元素地应用这个逻辑,生成一个新的列。

step5: 标签文本

mydata$label <- abs(mydata$Prop) %>% round(digits = 2)
head(mydata)
  • 在数据框 mydata 中添加一个名为 “label” 的新列,该列包含 “Prop” 列的绝对值,并将结果取两位小数

step6: 绘图

plot <- ggplot(mydata, aes(Prop, Group, fill = Sex)) + geom_col(width = 0.6, color = "black") + geom_text(aes(label = label), size = 4) + facet_share(~Sex, scales = "free_x", reverse_num = TRUE) + #ggtitle("福建省2021年人口年龄构成") + labs(x = "Prop(%)", # 设置 x 轴标签为 "Prop(%)"caption = "Source:福建省统计年鉴(2022)") + scale_fill_brewer(palette = "Set1"  ) + theme_bw(base_size = 15) + theme(axis.title.y = element_blank(),plot.title = element_text(hjust = 0.5),axis.text = element_text(colour = "black"))

在这里插入图片描述

  • facet_share() 进行分面

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

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

相关文章

查找局域网树莓派raspberry的mac地址和ip

依赖python库&#xff1a; pip install socket pip install scapy运行代码&#xff1a; import socket from scapy.layers.l2 import ARP, Ether, srpdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名ret…

【物以类聚】给el-image预览多张图片增加提示文字,让每张图片有所分类

【物以类聚】给el-image预览多张图片增加提示文字&#xff0c;让每张图片有所分类 一、需求二、el-image三、实施步骤3.1 导包3.2 改造3.3 引入 三、效果 一、需求 点击地图上的一张图片&#xff0c;弹出所有相关的图片资源&#xff0c;图片资源上显示每个图片的所属类型。 二…

python自制贪吃蛇小游戏

下面是代码分享一下&#xff1a;空格键停止&#xff0c;回车键开始。 """贪吃蛇""" import random import sys import time import copy import pygame from pygame.locals import * from collections import deque SCREEN_WIDTH 800 # 屏…

【linux】查看Debian应用程序图标对应的可执行命令

在Debian系统中&#xff0c;应用程序图标通常与.desktop文件关联。您可以通过查看.desktop文件来找到对应的可执行命令。这些文件通常位于/usr/share/applications/或~/.local/share/applications/目录下。这里是如何查找的步骤&#xff1a; 1. 打开文件管理器或终端。 2. 导…

PTA 6-11 先序输出叶结点

本题要求按照先序遍历的顺序输出给定二叉树的叶结点。 函数接口定义&#xff1a; void PreorderPrintLeaves( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left…

485.最大连续1的个数

前言 这两天突然发现力扣上还是有我能写出来的题的&#xff0c;虽说都是简单级别的&#xff08;以及一道中等的题&#xff09;&#xff0c;但是能写出来力扣真的太开心了&#xff0c;&#xff08;大佬把我这段话当个玩笑就行了&#xff09;&#xff0c;于是乎&#xff0c;我觉…

记一次 stackoverflowerror 线上排查过程

一.线上 stackOverFlowError xxx日,突然收到线上日志关键字频繁告警 classCastException.从字面上的报警来看,仅仅是类型转换异常,查看细则发现其实是 stackOverFlowError.很多同学面试的时候总会被问到有没有遇到过线上stackOverFlowError?有么有遇到后栈溢出?今天他来了,他…

LeetCode114二叉树展开为链表(相关话题:后序遍历)

题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…

面试题16.15.珠玑妙算

前言 这两天突然发现力扣上还是有我能写出来的题的&#xff0c;虽说都是简单级别的&#xff08;以及一道中等的题&#xff09;&#xff0c;但是能写出来力扣真的太开心了&#xff0c;&#xff08;大佬把我这段话当个玩笑就行了&#xff09;&#xff0c;于是乎&#xff0c;我觉…

Kafka(二)【文件存储机制 生产者】

目录 一、Kafka 文件存储机制 二、Kafka 生产者 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 案例演示 2.2、带回调函数的异步发送 2.3、同步发送 API 3、生产者分区 3.1、分区的好处 3.2、生产者发送消息的分区策略 &#xff08;1&am…

Vue3新特性defineModel()便捷的双向绑定数据

官网介绍 传送门 配置 要求&#xff1a; 版本&#xff1a; vue > 3.4(必须&#xff01;&#xff01;&#xff01;)配置&#xff1a;vite.config.js 使用场景和案例 使用场景&#xff1a;父子组件的数据双向绑定&#xff0c;不用emit和props的繁重代码 具体案例 代码实…