考察一个群体的多个表型或者一个表型的多个重复,我们想展示其分布和他们之间的相关关系可以使用柱状图和散点图(如下图所示)。

这幅图主要有两部分组成,一个是对角线上的柱状图,使用柱状图展示了每一个表型重复的分布;另一个就是对角线下面的散点图,用散点图展示两两之间的相关关系,并且用不同颜色表示点的密度,在上面标注其相关性。下面我们将使用R语言完成这幅图。
对于这幅图我们可以先分别绘制其中每一个部分,然后使用图片组合、拼接函数进行整合:
首先导入数据,数据格式如下,每一行代表一个样本,每一列代表一个重复:
>data <- read.table("./data.txt", header = T, row.names = 1, sep = "\t")
>data
pheno16rep1 pheno16rep2 pheno17 pheno18rep1 pheno18rep2
s1 28.4 24.9 27.740 27.72500 29.30000
s2 26.6 25.3 NA NA NA
s3 27.8 27.0 24.660 NA 27.97500
s4 25.5 26.9 22.680 29.27500 25.95000
s5 26.5 28.7 24.760 31.97500 27.52000
s6 .... .... ....... ........ ........
使用ggplot2扩展包绘制每一个分图。柱状图使用geom_histogram()绘制,散点图使用ggpointdensity包的geom_pointdensity()函数绘制,使用cor()函数计算两个重复之间的相关系数,并将其放在图片标题位置,并使用ggtext包的element_markdown()函数设置标题的主题,同时使用cowplot包的theme_half_open()函数设置整体主题。
>library(tidyverse)
>library(ggpointdensity)
>library(cowplot)
>library(ggtext)
>
># 柱状图
>p1 <- ggplot(data, aes(x = pheno16rep1)) +
> geom_histogram(binwidth = 1) +
> labs(x = NULL, y = NULL, title = cn[i]) +
> theme_half_open() +
> theme(plot.title = element_text(hjust = 0.5))
># 散点密度图
>p2 <- ggplot(data, aes(x = pheno16rep2, y = pheno16rep1)) +
> geom_pointdensity() +
> scale_color_continuous(type = "viridis") + # 设置点密度颜色梯度
> labs(x = NULL, y = NULL, title = paste("*R*: ", round(cor(df$col1, df$col2, use = "na.or.complete"), 2), sep = "")) +
> theme_half_open() +
> theme(legend.position = "NA",
> plot.title = element_markdown(hjust = 0.5,
> face = "plain"))

使用customLayout包进行图片组合,这个包可以对base绘图和ggplot2绘图进行整合,而且比较灵活。首先需要lay_new()函数创建一个拼接画布,然后使用lay_grid()函数组合各个图片。因为总共有5个重复,因此需要一个5×5的画图,如下图所示,各个分图从左上角开始往下排列走”之“字形排列。
>lay <- lay_new(mat = matrix(1:25, nrow = 5), widths = rep(1, 1), heights = rep(1, 1))
>lay_show(lay)

现在出现了一个问题,我们并没有在对角线上方安排图片,而lay_new()产生的是一个矩形排列画布,因此我们需要在右上角填充空白图片,并将空白图和柱状图、散点密度图整合。
>p <- ggplot() + theme_nothing()
>lay_grid(list(p1, p2, p3, ...), lay)
在一个5×5的组合中我们总共需要绘制25个分图,其中有多次重复的过程,并且最终图片是矩形有规律分布,因此为了减少代码长度我们可以使用循环来处理每个分图。根据lay_new()的组合形式可以设置两层循环分别处理行和列,并且因为组合图是从左上角开始向下排布,因此外层循环用来处理行,内层分布处理列。最后一点就是可以把这一系列代码写成一个function,方便以后使用。
最终代码如下所示:
library(tidyverse)
library(ggpointdensity)
library(cowplot)
library(ggtext)
library(customLayout)
## 定义pheCorDist函数
pheCorDist <- function(data) {
#
n <- ncol(data)
cn <- colnames(data)
Pall <- list()
index <- 1
#
for (j in 1:n) {
for (i in 1:n) {
df <- data[, c(i,j)]
colnames(df) <- c("col1", "col2")
if (i == j) {
p <- ggplot(df, aes(x = col1)) +
geom_histogram(binwidth = 1) +
labs(x = NULL, y = NULL, title = cn[i]) +
theme_half_open() +
theme(plot.title = element_text(hjust = 0.5))
} else if (i > j) {
p <- ggplot(df, aes(x = col2, y = col1)) +
geom_pointdensity() +
scale_color_continuous(type = "viridis") +
labs(x = NULL, y = NULL, title = paste("*R*: ", round(cor(df$col1, df$col2, use = "na.or.complete"), 2), sep = "")) +
theme_half_open() +
theme(legend.position = "NA",
plot.title = element_markdown(hjust = 0.5,
face = "plain"))
} else if(i < j) {
p <- ggplot() + theme_nothing()
}
Pall[index][[1]] <- p
index = index + 1
}
}
lay <- lay_new(mat = matrix(1:n^2, nrow = n), widths = rep(1, n), heights = rep(1, n))
lay_grid(Pall, lay)
}
# 导入数据并绘图
data <- read.table("./data.txt", header = T, row.names = 1, sep = "\t")
png(filename = "test.png", width = 10, height = 8, units = "in", res = 500)
pheCorDist(data)
dev.off()
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我
我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代
我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])
假设您有一个可执行文件foo.rb,其库bar.rb的布局如下:/bin/foo.rb/lib/bar.rb在foo.rb的header中放置以下要求以在bar.rb中引入功能:requireFile.dirname(__FILE__)+"../lib/bar.rb"只要对foo.rb的所有调用都是直接的,这就可以正常工作。如果你把$HOME/project和符号链接(symboliclink)foo.rb放入$HOME/usr/bin,然后__FILE__解析为$HOME/usr/bin/foo.rb,因此无法找到bar.rb关于foo.rb的目录名.我意识到像rubygems这
术语中文解释Ability原子化服务帮助用户完成任务的原子化服务,和用户的意图进行关联。Fulfillment服务履行通过图标,卡片,语音等形式呈现用户意图。开发者通过接口的方式,处理用户意图,返回内容。Intent意图用于表达用户想要达成的目标或完成的任务。HUAWEIAssistant智能助手“无微不智”的个人助手,通过不断的学习用户的使用习惯,不断的为用户提供贴心的精准的便捷的个性化服务。AISearch全局搜索用户可快速搜索关键词,与之匹配的原子化服务则会出现在搜索结果中。SmartService智慧服务用户订阅原子化服务,在到达特定触发条件(时间、地点、事件)后,卡片推送至用户智能助