云雨图(Raincloud)_高考分数段举例
lipiwang 2024-10-28 17:27 8 浏览 0 评论
云雨图(Raincloud Plot),是一种很美观的数据可视化技术,用于展示数据的分布情况,特别是用于统计分析中的单变量分布展示。这种图表结合了箱形图(box plot)、散点图(scatter plot)和直方图(histogram)的特点,能够提供比传统图表更丰富的信息。
正好这两天高考分数出来了,并且公布了每个分数的人数,正好通过这个图绘制出来看一下效果。使用的是四川23年和24年文理科的数据,不仅可以对比两年分数分布的变化,也可以看一下文理科的分布差异,具体图形如下↓
【云雨图的主要组成部分】
直方图部分:云雨图的底部是一个半边的直方图,它展示了数据的分布密度。直方图的条形通常从图的中心向外延伸,显示数据点的频率。
密度曲线:在直方图的上方,通常会叠加一条平滑的密度曲线,这条曲线是对数据分布的连续估计,帮助观察者更直观地理解数据的分布形态。
箱形图:在直方图和密度曲线的旁边,云雨图包含了一个箱形图,它展示了数据的中位数、四分位数以及可能的异常值。箱形图的“箱子”部分显示了数据的上四分位数(Q3)和下四分位数(Q1),而中间的线则代表中位数。
散点图:在箱形图的上下两端,云雨图还会用散点图的形式展示数据点。这些散点代表了数据集中的单个观测值,增加了图表的细节和真实感。
【云雨图的优势】
信息丰富:云雨图同时展示了数据的分布、集中趋势和离散程度,使得观察者能够快速把握数据的整体特征。
美观直观:与传统的箱形图或直方图相比,云雨图在视觉上更加吸引人,同时也更易于理解。
灵活性:云雨图可以根据需要调整显示的细节,比如可以隐藏散点图部分,或者调整直方图的宽度等。
【图片生成演示】
先使用模拟的数据,简单举一个例子,看一下数据结构如何↓
library(ggplot2)
library(dplyr)
library(ggdist)
library(showtext)
showtext_auto()
# 生成示例数据
data <- data.frame(
group = rep(c("A", "B"), each = 100),
value = c(rnorm(100, mean = 5, sd = 1), rnorm(100, mean = 7, sd = 1.5))
)
数据结构很简单,就两列,第一列是分类变量,第二列是具体的数值,接下来绘制一个最简单的云雨图,其实就是在ggplot里面,增加了ggdist、geom_boxplot和geom_jitter三个对象的组合,代码和结果如下↓
ggplot(data, aes(x = group, y = value, fill = group)) +
ggdist::stat_halfeye(
adjust = .5,
width = .6,
.width = 0,
justification = -.3,
point_colour = NA
) +
geom_boxplot(
width = .25,
outlier.shape = NA
) +
geom_jitter(
width = .1,
alpha = .3
) +
theme_minimal() +
labs(title = "云雨图Raincloud Plot", x = "分组", y = "数值") +
theme(legend.position = "none")
可以看到,基本已经成型了,但是我们还想再图上展示出中位数和上下四分位数,便于我们判断数据的分布大概范围,首先计算几个数值↓
summary_stats <- data %>%
group_by(group) %>%
summarise(
median = median(value),
q1 = quantile(value, 0.25),
q3 = quantile(value, 0.75)
)
然后就可以通过geom_text把这几个关键值放入图表中了↓
ggplot(data, aes(x = group, y = value, fill = group)) +
ggdist::stat_halfeye(
adjust = .5,
width = .6,
.width = 0,
justification = -.3,
point_colour = NA
) +
geom_boxplot(
width = .25,
outlier.shape = NA
) +
geom_jitter(
width = .1,
alpha = .3
) +
geom_text(data = summary_stats, aes(x = group, y = median, label = round(median, 2)),
color = "black", size = 5, vjust = 0) +
geom_text(data = summary_stats, aes(x = group, y = q1, label = round(q1, 2)),
color = "black", size = 5, vjust = 1.1) +
geom_text(data = summary_stats, aes(x = group, y = q3, label = round(q3, 2)),
color = "black", size = 5, vjust = -0.2) +
theme_minimal() +
labs(title = "云雨图Raincloud Plot", x = "分组", y = "数值") +
theme(legend.position = "none")
如果我们对默认的图形颜色不满意,还可以自定义颜色↓
custom_colors <- c("A" = "blue", "B" = "green")
# 绘制云雨图
ggplot(data, aes(x = group, y = value, fill = group)) +
ggdist::stat_halfeye(
adjust = .5,
width = .6,
.width = 0,
justification = -.3,
point_colour = NA
) +
geom_boxplot(
width = .25,
outlier.shape = NA
) +
geom_jitter(
width = .1,
alpha = .3
) +
geom_text(data = summary_stats, aes(x = group, y = median, label = round(median, 2)),
color = "red", size = 5, vjust = -1.5) +
geom_text(data = summary_stats, aes(x = group, y = q1, label = round(q1, 2)),
color = "red", size = 5, vjust = 1.5) +
geom_text(data = summary_stats, aes(x = group, y = q3, label = round(q3, 2)),
color = "red", size = 5, vjust = 1.5) +
scale_fill_manual(values = custom_colors) +
theme_minimal() +
labs(title = "Raincloud Plot", x = "Group", y = "Value") +
theme(
legend.position = "none",
axis.title = element_text(size = 18), # 设置轴标签字体大小
plot.title = element_text(size = 20) # 设置标题字体大小
)
【实际高考数据演示】
数据是四川2023和2024年分文理科的四张表格,格式如下↓
我们先读入2024年理科的成绩,然后还需要进行数据处理,因为这里每个分数是合计的人数,我们需要处理成一个分数一行的格式↓
df_gaokao_l <- read.delim("clipboard")
expanded_df_l <- df_gaokao_l[rep(row.names(df_gaokao_l), df_gaokao_l$人数), ]
expanded_df_l$kemu <- "24理科"
已经是我们想要的格式了,接下来分别把其他三张表读进来,然后按照同样的方式进行处理,最后把四张表进行合并↓
df_gaokao_w <- read.delim("clipboard")
expanded_df_w <- df_gaokao_w[rep(row.names(df_gaokao_w), df_gaokao_w$人数), ]
expanded_df_w$kemu <- "24文科"
df_gaokao_l <- read.delim("clipboard")
expanded_df_l23 <- df_gaokao_l[rep(row.names(df_gaokao_l), df_gaokao_l$人数), ]
expanded_df_l23$kemu <- "23理科"
df_gaokao_w <- read.delim("clipboard")
expanded_df_w23 <- df_gaokao_w[rep(row.names(df_gaokao_w), df_gaokao_w$人数), ]
expanded_df_w23$kemu <- "23文科"
expanded_df <- rbind(expanded_df_w,expanded_df_l,expanded_df_w23,expanded_df_l23)
最后我们得到了一个101万行的数据表格,每一行就是一个同学的分数,下面进行可视化↓
custom_colors <- c("24理科" = "#4280fc", "24文科" = "#de6021",
"23理科" = "#5e99ad", "23文科" = "#cf997e")
summary_stats <- expanded_df %>%
group_by(kemu) %>%
summarise(
median = median(分数),
q1 = quantile(分数, 0.25),
q3 = quantile(分数, 0.75)
)
ggplot(expanded_df, aes(x = kemu, y = 分数, fill = kemu)) +
ggdist::stat_halfeye(
adjust = .5,
width = .6,
.width = 0,
justification = -.3,
point_colour = NA
) +
geom_boxplot(
width = .25,
outlier.shape = NA
) +
geom_jitter(
width = .1,
alpha = 0.005
) +
geom_text(data = summary_stats, aes(x = kemu, y = median, label = round(median, 2)),
color = "black", size = 10, vjust = 0) +
geom_text(data = summary_stats, aes(x = kemu, y = q1, label = round(q1, 2)),
color = "black", size = 10, vjust = 1.1) +
geom_text(data = summary_stats, aes(x = kemu, y = q3, label = round(q3, 2)),
color = "black", size = 10, vjust = -0.2) +
scale_fill_manual(values = custom_colors) +
theme_minimal() +
labs(title = "2023-2024四川高考文理科分数分布", x = "分组", y = "高考分数") +
theme(
legend.position = "top",
axis.title = element_text(size = 18), # 设置轴标签字体大小
axis.text.x = element_text(size = 20), # 设置X轴标签字体大小
axis.text.y = element_text(size = 20), # 设置X轴标签字体大小
plot.title = element_text(size = 20) # 设置标题字体大小
)
可以看到,理科整体分布比较正态,24年整体分数比23年高20分左右;而文科整体分数比理科低,23年和24年差别不大,但是呈现双峰的分布形态。
我们还可以通过设置coord_flip(),把图形从垂直显示改成水平显示↓
ggplot(expanded_df, aes(x = kemu, y = 分数, fill = kemu)) +
ggdist::stat_halfeye(
adjust = .5,
width = .6,
.width = 0,
justification = -.3,
point_colour = NA
) +
geom_boxplot(
width = .25,
outlier.shape = NA
) +
geom_jitter(
width = .1,
alpha = 0.005
) +
geom_text(data = summary_stats, aes(x = kemu, y = median, label = round(median, 2)),
color = "black", size = 10, vjust = 0) +
geom_text(data = summary_stats, aes(x = kemu, y = q1, label = round(q1, 2)),
color = "black", size = 10, vjust = 0) +
geom_text(data = summary_stats, aes(x = kemu, y = q3, label = round(q3, 2)),
color = "black", size = 10, vjust = 0) +
scale_fill_manual(values = custom_colors) +
coord_flip() + # 将图表改为水平显示
theme_minimal() +
labs(title = "2023-2024四川高考文理科分数分布", x = "分组", y = "高考分数") +
theme(
legend.position = "top",
axis.title = element_text(size = 18), # 设置轴标签字体大小
axis.text.x = element_text(size = 20), # 设置X轴标签字体大小
axis.text.y = element_text(size = 20), # 设置X轴标签字体大小
plot.title = element_text(size = 20) # 设置标题字体大小
)
数据链接如下,可下载使用↓
https://linss.oss-cn-beijing.aliyuncs.com/Excel/2024gaokao.xlsx
链接是我使用PowerBI整合的历史文章,按类型分类,可以根据需求查询:Microsoft Power BI↓
https://app.powerbi.com/view?r=eyJrIjoiNjI2NWQ3NjktYjU0ZC00ZWZhLTgzMDgtMGI4ZTk1ZDlkODM3IiwidCI6IjI3NDQ3MWQ0LTM4ZDQtNDVlZS1hMmJkLWU1NTVhOTBkYzM4NiJ9End
相关推荐
- 想减少Windows 11内存占用?请取消固定Teams
-
如果你想要提高Windows11系统的运行速度,那么可以禁用某些默认启用的功能和设置。如果你的Windows11是安装在已经停止支持的设备或者内存容量不高的旧设备,那么应该立即限制或禁用固...
- Windows查看端口占用、查看PID对应的进程、并终止进程
-
Windows下:查看端口占用netstat-ano|findstr"端口号"获取到pid查看PID对应的进程tasklist|findstr"进程ID"...
- 计算机组成原理(36): 分时之一——进程
-
建立一个虚拟机VM目标:给每个程序一个自己的虚拟机“VirtualMachine”,程序并不知道其他的虚拟机。1.1进程(Process)为了捕获正在运行的程序,我们创建一个称为“进程(Proce...
- window系统如何停止端口被占用的进程(高手版)
-
如上图1,作为开发人员是不是经常遇到这个问题?(Webserverfailedtostart.Port9527wasalreadyinuse.)当然,如果在你知道确实有某个进程正占...
- 电脑的文件无法删除咋回事?你需要这款神兵利器
-
很多朋友用电脑的时候,都遇到过文件无法删除的情况。这往往是由于文件被某个软件、进程所调用所引发的——在Windows中,某个文件如果被使用,这个文件可能就没法进行删除、重命名之类的操作了。想要进一步操...
- Windows日志分析(windows 日志文件)
-
1.Windows日志文件简介1.1Windows日志核心分类1.系统日志系统日志包含由Windows系统组件记录的事件,记录系统进程和设备驱动程序的活动。由它审核的系统事件包括启动失败的设备驱动程...
- 电脑软件崩溃、闪退不用慌!DJS Tech 教你几招轻松解决
-
当你正全神贯注用电脑处理重要文件、沉浸在精彩的游戏世界,或是观看喜欢的视频时,软件突然崩溃、闪退,那一刻的烦躁简直难以言喻。别着急,DJSTech作为深耕计算机领域多年的专业团队,为你带来一系列超...
- 微软Win11推进淘汰控制面板,时间服务器配置迁移至设置应用
-
IT之家5月29日消息,科技媒体Winaero昨日(5月28日)发布博文,报道称微软在Windows11系统中,继续推进“淘汰控制面板”进程,配置时间服务器地址选项迁移到设置应...
- 微软 PowerToys更新,可帮你找出 Win11上哪些进程正在占用该文件
-
IT之家11月3日消息,微软针对Windows11和Windows10的PowerToys已经更新到了最新的0.64.0版本,并上线了一个名为“文件锁匠FileLock...
- Windows基础操作 认识任务管理器(windows任务管理器的使用)
-
Windows基础操作:认识任务管理器任务管理器(TaskManager)是Windows系统中一个功能强大的实用工具,它为用户提供了实时监控系统资源、管理正在运行的程序和服务的能力。掌握任务管理器...
- windows——netstat过滤(终止进程)
-
windows——netstat过滤(终止进程)在Windows操作系统中,使用netstat命令可以查看网络连接的状态。要过滤特定协议或端口的连接,可以使用以下命令:查看所有连接:netstat-...
- 只要这么做 Windows Defender与第三方就能和平共存啦
-
无论大家是否喜欢WindowsDefender,伴随着Windows10的不断升级,它已经成为系统的底层必备组件之一。虽然我们有各种各样的方法去关闭它,换用顺手的第三方,但只要更新打补丁,噩梦就来...
- Win10如何彻底关闭wsappx进程(win10 wsappx怎么关闭)
-
win10如何彻底关闭wsappx进程?wsappx进程是什么?wsappx进程是Windows10系统的一部分,这个进程是WindowsStore和微软通用应用程序平台(UWP)的依赖进程。...
- Windows环境黑客入侵应急与排查(黑客入侵电脑原理)
-
1文件分析1.1临时目录排查黑客往往可能将病毒放在临时目录(tmp/temp),或者将病毒相关文件释放到临时目录,因此需要检查临时目录是否存在异常文件。假设系统盘在C盘,则通常情况下的临时目录如下...
- Windows 11 24H2 KB5044384出现大面积安装失败、任务管理器0进程等问题
-
Windows11KB5044384更新由于出现大量错误而无法在Windows1124H2上安装、其中包括一个奇怪的错误,即由于0x800f0922、0x800736b3和0x8...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)