审稿人:你都用ggplot2画图了,就不能提高下审美吗?

文摘   2024-12-18 09:00   荷兰  
先插播一条重要新闻:
亲爱的朋友们大家好,这个公众号自2023年建立,今年4月份大量更新之后,目前已经收获了4万+的粉丝,文字的教程固然能够详细的阐述数据分析的原理,但现在已经是(短)视频的时代了, 我今后也将会更新更多的视频内容,我的视频账号名字是:Michael科研代码
目前我们在微信的视频号平台已经更新了第一条与PCA主成分分析有关的视频教程:用“再见爱人”的方式打开PCA主成分分析。

其次,在视频领域我们还会以R/Python为主,数据库SQL,云计算等方向为辅,适当的科研生活类短视频作为调剂,争取能够活跃在B站,小抖,小番薯等平台,上面提到的PCA短视频也已经更新到了上述三个平台,账号名也是Michael科研代码
感谢朋友们之前的大力支持,我们以往所承诺的在线免费公益课,也会陆陆续续的开发出来。欢迎继续关注!下面进入今天的正文。
前言
前段时间我们更新了很多建模的教程,现在让我们再聚焦数据可视化领域,很多朋友喜欢使用R语言进行数据可视化,自然ggplot2是必须要掌握的。我们都知道,ggplot2是R语言中广泛使用的可视化工具,但默认的图表美观程度可能达不到发表级别的标准。在高水平的科研期刊上,图表往往具备极简风格、统一的颜色、专业的字体和高可读性。今天的更新将以柱状图为例,手把手教你如何优化ggplot2图表,打造专业级的美学效果。

一、准备数据

我们以mtcars数据集为例,计算不同气缸数(cyl)的平均马力(hp)。
# 加载必要的包
library(ggplot2)
library(dplyr)

# 数据处理
data <- mtcars %>%
group_by(cyl) %>%
summarise(mean_hp = mean(hp))

# 查看数据
print(data)
## # A tibble: 3 × 2
## cyl mean_hp
## <dbl> <dbl>
## 1 4 82.6
## 2 6 122.
## 3 8 209.
二、绘制初始柱状图
我们先绘制一个最基础的柱状图:
# 初始柱状图
p <- ggplot(data, aes(x = factor(cyl), y = mean_hp)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(x = "Cylinders", y = "Mean Horsepower", title = "Mean Horsepower by Cylinders") +
theme_minimal()

print(p)
这张图虽然基本达到了可视化效果,但它看起来过于简单,缺乏高级感。接下来我们逐步优化,追求杂志级的美学效果。

三、分步骤优化美学

1. 优化字体

科学期刊的图表通常使用无衬线字体(如Arial, Helvetica)和统一的字体大小。
# 设置字体
library(showtext) # 用于引入自定义字体
showtext_auto() # 自动启用showtext

# 导入字体
font_add("Arial", "arial.ttf") # 确保系统中存在arial.ttf字体文件
调整字体:
p <- p +
theme(
text = element_text(family = "Arial"), # 字体
axis.title = element_text(size = 14), # 坐标轴标题
axis.text = element_text(size = 12), # 坐标轴刻度
plot.title = element_text(size = 16, hjust = 0.5, face = "bold") # 标题居中加粗
)
print(p)

2. 美化柱体形状和颜色

为了避免单调,我们可以:使用自定义颜色(如期刊常用的灰度或单色系),增加柱体边框,优化柱体的宽度等
# 自定义颜色和柱体形状
p <- ggplot(data, aes(x = factor(cyl), y = mean_hp)) +
geom_bar(stat = "identity", width = 0.6, color = "black", fill = "#5A9BD5") + # 高级蓝色
labs(x = "Cylinders", y = "Mean Horsepower", title = "Mean Horsepower by Cylinders") +
theme_minimal(base_family = "Arial")

print(p)

3. 调整图例与坐标轴

# 调整坐标轴
p <- p +
scale_y_continuous(expand = expansion(mult = c(0, 0.05)), limits = c(0, 230)) + # Y轴从0开始
theme(
axis.line = element_line(color = "black"), # 添加坐标轴线
panel.grid = element_blank(), # 去掉网格线
axis.ticks = element_line(color = "black") # 添加坐标轴刻度
)

print(p)

4. 优化标题与注释

图表的的标题最好是简洁且专业,然后我们也可以添加数据标签显示具体数值。
# 添加数据标签
p <- p +
geom_text(aes(label = round(mean_hp, 1)), vjust = -0.5, size = 4, family = "Arial") +
labs(
title = "Mean Horsepower by Cylinders",
subtitle = "Data from mtcars dataset",
caption = "Source: R built-in dataset 'mtcars'"
) +
theme(
plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
plot.subtitle = element_text(size = 12, hjust = 0.5, color = "gray40"),
plot.caption = element_text(size = 10, hjust = 1, color = "gray40")
)

print(p)

5. 分组柱状图

但在实际的数据分析中,很多时候需要展现不同分组的统计学结果,我们可以使用分组柱状图来进行展示。以下步骤展示如何在X轴增加分组,并使用不同的灰度颜色来区分各组,同时控制柱子的宽度和图表美观度。将不同的cyl(气缸数)作为X轴,同时将am(变速器类型:0 = 自动,1 = 手动)作为分组变量,展示平均马力。
# 数据处理:按cyl和am分组计算平均马力
data_grouped <- mtcars %>%
group_by(cyl, am) %>%
summarise(mean_hp = mean(hp)) %>%
mutate(am_label = ifelse(am == 0, "Automatic", "Manual")) # 分组标签

# 查看数据
print(data_grouped)
## # A tibble: 6 × 4
## # Groups: cyl [3]
## cyl am mean_hp am_label
## <dbl> <dbl> <dbl> <chr>
## 1 4 0 84.7 Automatic
## 2 4 1 81.9 Manual
## 3 6 0 115. Automatic
## 4 6 1 132. Manual
## 5 8 0 194. Automatic
## 6 8 1 300. Manual
# 使用`position_dodge`实现分组并调整柱体间距
# 分组柱状图

p_grouped <- ggplot(data_grouped, aes(x = factor(cyl), y = mean_hp, fill = am_label)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6, color = "black") +
scale_fill_manual(values = c("Automatic" = "gray70", "Manual" = "gray40")) + # 自定义灰度颜色
labs(
x = "Cylinders",
y = "Mean Horsepower",
title = "Mean Horsepower by Cylinders and Transmission",
fill = "Transmission"
) +
theme_minimal(base_family = "Arial") +
theme(
text = element_text(size = 12),
axis.title = element_text(size = 14),
axis.text = element_text(size = 12),
plot.title = element_text(size = 16, hjust = 0.5, face = "bold"),
legend.position = "top", # 图例位置
panel.grid = element_blank(), # 去除网格线
axis.line = element_line(color = "black") # 坐标轴线
)

# 输出图表
print(p_grouped)

6. 数值标签

为了提高可读性,可以在柱子顶部添加数值标签:
# 添加数据标签
p_grouped <- p_grouped +
geom_text(aes(label = round(mean_hp, 1)),
position = position_dodge(width = 0.7),
vjust = -0.5, size = 4, family = "Arial")

# 输出图表
print(p_grouped)

五、小结

通过对字体、颜色、坐标轴和标题的细致调整,ggplot2可以制作出符合绝大部分杂志所期待专业图表。因为ggplot具有很高的个性化定制能力,大家还可以根据自己的需求进一步微调,适用于不同的科研和工作场景,例如专业级的分组柱状图。希望这篇教程对你有帮助,欢迎留言交流!
感谢关注,你的支持是我不懈的动力!

科研代码
专注R和Python的数据分析。
 最新文章