R绘图 | 一幅小提琴图的美化之旅

简介: R绘图 | 一幅小提琴图的美化之旅

绘制


# 加载包
library(tidyverse)
library(ggplot2)
# 示例数据准备
niwot_plant_exp <- read.csv("niwot_plant_exp.csv")
# Calculate species richness per plot per year
niwot_richness <- niwot_plant_exp %>% 
  group_by(plot_num, year) %>%
  mutate(richness = length(unique(USDA_Scientific_Name))) %>% 
  ungroup()
distributions1 <- ggplot(niwot_richness, aes(x = fert, y = richness)) +
    geom_violin()
distributions1

image.png

distributions1

图很丑,但这是对数据分布的有效观察。我们可以添加一些颜色,也可以添加我们的自定义主题。

theme_niwot <- function(){
  theme_bw() +
    theme(text = element_text(family = "Helvetica Light"),
          axis.text = element_text(size = 16), 
          axis.title = element_text(size = 18),
          axis.line.x = element_line(color="black"), 
          axis.line.y = element_line(color="black"),
          panel.border = element_blank(),
          panel.grid.major.x = element_blank(),                                          
          panel.grid.minor.x = element_blank(),
          panel.grid.minor.y = element_blank(),
          panel.grid.major.y = element_blank(),  
          plot.margin = unit(c(1, 1, 1, 1), units = , "cm"),
          plot.title = element_text(size = 18, vjust = 1, hjust = 0),
          legend.text = element_text(size = 12),          
          legend.title = element_blank(),                              
          legend.position = c(0.95, 0.15), 
          legend.key = element_blank(),
          legend.background = element_rect(color = "black", 
                                           fill = "transparent", 
                                           size = 2, linetype = "blank"))
}
distributions2 <- ggplot(niwot_richness, aes(x = fert, y = richness)) +
  geom_violin(aes(fill = fert, colour = fert), alpha = 0.5) +
  # alpha控制不透明度
  theme_niwot()

distributions2

image.png

distributions2

看起来好多了,但对于读者来说,要找出每个类别的平均值仍然很难。这样我们就可以用箱形图把小提琴覆盖起来。

distributions3 <- ggplot(niwot_richness, aes(x = fert, y = richness)) +
  geom_violin(aes(fill = fert, colour = fert), alpha = 0.5) +
  geom_boxplot(aes(colour = fert), width = 0.2) + # 添加箱线图图层
  theme_niwot()

distributions3

image.png

distributions3

虽然箱线图在图上添加了更多的信息,但我们仍然不知道数据点的确切位置,小提琴的平滑函数有时会隐藏给定变量的真实值。不用箱线图,我们可以加上实际数据点。

distributions4 <- ggplot(niwot_richness, aes(x = fert, y = richness)) +
  geom_violin(aes(fill = fert, colour = fert), alpha = 0.5) +
  geom_jitter(aes(colour = fert), position = position_jitter(0.1), # 添加散点
              alpha = 0.3) +
  theme_niwot()

distributions4

image.png

distributions4

可以看到,虽然能看到真实的数据,但当这些点放在小提琴上时,很难区分。这就到了雨云图发挥作用的时候,它结合了真实数据点和箱线图的分布。

# This code loads the function in the working environment
source("geom_flat_violin.R") 
distributions5 <- 
  ggplot(data = niwot_richness, 
         aes(x = reorder(fert, desc(richness)), y = richness, fill = fert)) +
  # 半小提琴
  geom_flat_violin(position = position_nudge(x = 0.2, y = 0), alpha = 0.8) +
  # 散点
  geom_point(aes(y = richness, color = fert), 
             position = position_jitter(width = 0.15), size = 1, alpha = 0.1) +
  # 箱线
  geom_boxplot(width = 0.2, outlier.shape = NA, alpha = 0.8) +
  # \n 添加一个新行,在轴和轴标题之间创建一些空间
  labs(y = "Species richness\n", x = NULL) +
  # 删除图例
  guides(fill = FALSE, color = FALSE) +
  # 设置 y 轴范围
  scale_y_continuous(limits = c(0, 30)) +
  # 颜色
  scale_fill_manual(values = c("#5A4A6F", "#E47250",  "#EBB261", "#9D5A6C")) +
  scale_colour_manual(values = c("#5A4A6F", "#E47250",  "#EBB261", "#9D5A6C")) +
  theme_niwot()
distributions5

image.png

distributions5

可以翻转x轴和y轴。

v

image.png

distributions6

美化之旅到此结束啦!


参考


Efficient and beautiful data visualisation (ourcodingclub.github.io)(https://ourcodingclub.github.io/tutorials/dataviz-beautification/#distributions)


相关文章
|
3月前
|
数据可视化
R语言多图合成:优雅地在一个画布上展示多个图形
【8月更文挑战第30天】R语言提供了多种方法来实现多图合成,从基础的`par()`函数到高级的`gridExtra`、`ggplot2`和`cowplot`包,每种方法都有其独特的优势和应用场景。通过掌握这些技术,你可以根据实际需求灵活地组合图形,从而更高效地展示和解读数据。希望本文能为你提供一些有益的参考和启示。
|
6月前
|
缓存 数据库 数据安全/隐私保护
我绘制文章插图的三个神级工具
我绘制文章插图的三个神级工具
109 0
|
6月前
|
存储 数据可视化
使用 plotly 绘制旭日图
使用 plotly 绘制旭日图
303 0
|
API 计算机视觉
【OpenCV图像处理3】绘制基本图形
【OpenCV图像处理3】绘制基本图形
104 0
|
数据可视化
【视觉基础篇】15 # 如何用极坐标系绘制有趣图案?
【视觉基础篇】15 # 如何用极坐标系绘制有趣图案?
168 0
【视觉基础篇】15 # 如何用极坐标系绘制有趣图案?
|
数据可视化
Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解
qt提供了q3d进行三维开发,虽然这个框架没有得到大量运用也不是那么成功,性能上也有很大的欠缺,但是普通的点到为止的应用展示还是可以的。其中就包括华丽绚烂的三维图表,数据量不大的时候是可以使用的。前面介绍了基础的q3d散点图、柱状图,本篇介绍基础的三维曲面图。Q3DSurface类提供了渲染3D曲面图的方法。该类使开发人员能够渲染3D表面图,并通过自由旋转场景来查看它们。可以通过QSurface3DSeries控制曲面的视觉财产,例如绘制模式和着色。
Matlab论文插图绘制模板—水平三维柱状图(渐变)
Matlab论文插图绘制模板—水平三维柱状图(渐变)
Matlab论文插图绘制模板—水平三维柱状图(渐变)
|
数据挖掘 Python
Python数据分析与展示:图像的手绘效果-5
Python数据分析与展示:图像的手绘效果-5
184 0
Python数据分析与展示:图像的手绘效果-5
|
存储 C++ Windows
眼前一亮!2款免费手绘风流程图绘制工具
“这种风格的流程图好漂亮啊,请问是用什么工具画的啊?”
眼前一亮!2款免费手绘风流程图绘制工具
|
人工智能 API
手把手教你如何绘制自己的跳舞词云图~
首先我们要先准备一个热舞视频,从哪里下载的都可以,我是用You-Get从B站上下载的,命令如下:
355 0
手把手教你如何绘制自己的跳舞词云图~