百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

云雨图(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...

取消回复欢迎 发表评论: