查看原文
其他

用ggplot画你们心中的女神

文涛聊科研 微生信生物 2022-05-08

用ggplot画你们心中的女神

注意文件名为英文;图形格式为jpg。

# Packages (for the entire project)
library(imager) # image loading and processing
# library(BiocInstaller)
# biocLite("ggvoronoi" )
library(dplyr) # data manipulation
library(ggplot2) # data visualization
library(tidyr) # data wrangling
library(ggvoronoi) # visualization

# Load an image into R
img <- load.image(file = "./shenqinvxia.jpg")

图像即数据

X:图像点(像素)的水平位置。 Y:图像点(像素)的垂直位置。 cc:表示的颜色通道:1(红色)、2(绿色)、3(蓝色) 值:颜色通道的值,从0到1。

# 将图像转换为数据框
img_df <- as.data.frame(img)
head(img_df)
## x y cc value
## 1 1 1 1 0.6745098
## 2 2 1 1 0.7529412
## 3 3 1 1 0.7764706
## 4 4 1 1 0.7843137
## 5 5 1 1 0.7372549
## 6 6 1 1 0.6549020
library(kableExtra)
library("knitr")
# Show a table of the first 10 rows of the data frame
img_df %>%
arrange(x, y, cc) %>% # sort by columns for viewing
filter(row_number() < 10) %>% # Select top 10 columns
kable("html") %>% # Display table in R Markdown
kable_styling(full_width = F) # Don't take up full width
xyccvalue
1110.6745098
1120.6784314
1130.6980392
1210.7137255
1220.7176471
1230.7372549
1310.6745098
1320.6784314
1330.6980392

ggplot出图需要这样实现

将颜色转化为RGB格式,需要通过函数rgb实现

# Add more expressive labels to the colors
img_df <- img_df %>%
mutate(channel = case_when(
cc == 1 ~ "Red",
cc == 2 ~ "Green",
cc == 3 ~ "Blue"
))

# Reshape the data frame so that each row is a point
img_wide <- img_df %>%
select(x, y, channel, value) %>%
spread(key = channel, value = value) %>%
mutate(
color = rgb(Red, Green, Blue)
)

head(img_wide)
## x y Blue Green Red color
## 1 1 1 0.6980392 0.6784314 0.6745098 #ACADB2
## 2 1 2 0.7372549 0.7176471 0.7137255 #B6B7BC
## 3 1 3 0.6980392 0.6784314 0.6745098 #ACADB2
## 4 1 4 0.6588235 0.6392157 0.6352941 #A2A3A8
## 5 1 5 0.7058824 0.6901961 0.6862745 #AFB0B4
## 6 1 6 0.7568627 0.7411765 0.7372549 #BCBDC1

鉴于原图过大,这里过滤

过滤原理是:将图像完整数据框中的点为库,随机抽取部分的点进行出图。sample(nrow(img_wide), sample_size)。

# Take a sample of rows from the data frame
sample_size <- 30000
img_sample <- img_wide[sample(nrow(img_wide), sample_size), ]

# Plot only the sampled points
ggplot(img_sample) +
geom_point(mapping = aes(x = x, y = y, color = color)) +
scale_color_identity() +
scale_y_reverse() +
theme_void()

 ### 构建随机数字并映射为图形点的大小,达到美术效果

# 我们构建随机数字
img_sample$size <- runif(sample_size)

# Plot only the sampled points
ggplot(img_sample) +
geom_point(mapping = aes(x = x, y = y, color = color, size = size)) +
guides(size = FALSE) + # 去除图例
scale_color_identity() +
scale_y_reverse() +
theme_void()

 ### 使用三原色中的蓝色列为大小,映射到点上

# Use the amount of blue present in each point to determine the size
ggplot(img_sample) +
geom_point(mapping = aes(x = x, y = y, color = color, size = Blue)) +
guides(size = FALSE) + # don't show the legend
scale_color_identity() + # use the actual value in the `color` column
scale_y_reverse() + # Orient the image properly (it's upside down!)
theme_void() # Remove axes, background

 ### 泰森多边形 这种出图我们一般不经常使用,但是此处使用达到某种艺术效果

# Create a Voronoi Diagram of the sampled points
ggplot(img_sample) +
geom_voronoi(mapping = aes(x = x, y = y, fill = color)) +
scale_fill_identity() +
scale_y_reverse() +
theme_void()

# 监测图形便
edges <- cannyEdges(img)

# 展示图形轮廓
plot(edges)

将边图像转化为数据框

# 将边图像转化为数据框
edges_df <- edges %>%
as.data.frame() %>%
select(x, y) %>% # only select columns of interest
distinct(x, y) %>% # remove duplicates
mutate(edge = 1) # indicate that these observations represent an edge

在原图形数据框中整合边框数据

# 在原图形数据框中整合边框数据
img_wide <- img_wide %>%
left_join(edges_df)

# Apply a low weight to the non-edge points
img_wide$edge[is.na(img_wide$edge)] <- .05

# Re-sample from the image, applying a higher probability to the edge points
img_edge_sample <- img_wide[sample(nrow(img_wide), sample_size, prob = img_wide$edge), ]

加入边数据,使用维诺图出图,强调图像边

# 重新出图
ggplot(img_edge_sample) +
geom_voronoi(mapping = aes(x = x, y = y, fill = color)) +
scale_fill_identity() +
guides(fill = FALSE) +
scale_y_reverse() +
theme_void() # Remove axes, background

#
ggplot(img_edge_sample) +
geom_point(mapping = aes(x = x, y = y, color = color, size = edge * runif(sample_size))) +
guides(fill = FALSE, size= FALSE) +
scale_color_identity() +
scale_y_reverse() +
theme_void()

原文地址 http://mfviz.com/r-image-art/

# Print the image object out
print(img)
## Image. Width: 352 pix Height: 220 pix Depth: 1 Colour channels: 3#可视化图像
plot(img)


欢迎加入微生信生物讨论群,扫描下方二维码添加小编微信,小编带你入伙啦,大牛如云,让交流变得简单。

历史目录

R语言分析技术

  1. 《扩增子16s核心OTU挑选-基于otu_table的UpSet和韦恩图》

  2. 《分类堆叠柱状图顺序排列及其添加合适条块标签》

  3. 《R语言绘制带有显著性字母标记的柱状图》

  4. 《使用R实现批量方差分析(aov)和多重比较(LSD)》

  5. Rstudio切换挂载R版本及本地安装一些包

  6. 玩转R包

扩增子专题

  1. 《16s分析之Qiime数据整理+基础多样性分析》

  2. 《16s分析之差异展示(热图)》

  3. 迅速提高序列拼接效率,得到后续分析友好型输入,依托qiime

  4. https://mp.weixin.qq.com/s/6zuB9JKYvDtlomtAlxSmGw》

  5. 16s分析之网络分析一(MENA)

  6. 16s分析之进化树+差异分析(一)

  7. 16s分析之进化树+差异分析(二)

  8. Qiime2学习笔记之Qiime2网站示例学习笔记

  9. PCA原理解读

  10. PCA实战

  11. 16s分析之LEfSe分析

基于phyloseq的微生物群落分析

  1. 开年工作第一天phyloseq介绍

  2. phyloseq入门

代谢组专题

  1. 非靶向代谢组学数据分析连载(第零篇引子)

  2. 非靶向代谢组学分析连载(第一篇:缺失数据处理、归一化、标准化)

当科研遇见python

1.当科研遇见python

科学知识图谱

杂谈

  1. 我的生物信息之路


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存