精华内容
下载资源
问答
  • Hello,小伙伴们,今天这篇推文上周发过一次,但因为部分文字内容误没有审查准确,现在修改后再推一次。小伙伴们,在遇到组学实验数据分析得时候,是少不了绘制PCA图的,但是除了常规的PCA图以外,往往也需要在...

    Hello,小伙伴们,今天这篇推文上周发过一次,但因为部分文字内容有误没有审查准确,现在修改后再推一次。

    小伙伴们,在遇到组学实验数据分析得时候,是少不了绘制PCA图的,但是除了常规的PCA图以外,往往也需要在我们的流程结果的PCA上展现组内样品的分布范围:

    像这样的

    22f36ac156d0e28d8214cc5ab292914b.png

    这样的

    80ac03a7fc679130fc1dbb3588918a7c.png

    其实,本质上这些圆圈是在PCA图的基础上,加了一个置信区间。但是我之前都是在ppt上手动加的。这样总觉得哪里不太对,万一这样和老师说,到时候发文章被审稿人问起怎么办呢?

    所以这种分析要求,最好的方法是提交给分析。另外我们公司R语言培训中也有专门的PCA的图形绘制。其中也涉及了用ggplot2来绘制PCA加圈的图。例如我们这篇文章的封面图片就是用ggplot2画的。但是ggplot功能强大,也就意味着参数多啊,所以还是我们的ggord简单易上手,另外还可以加入变量的”小线条“。

    所以老师如果想自己动手,丰衣足食的话。别急,我们有简化版的PCA绘制教程。用R语言绘制完成后,再用PS和AI适当修改一下就可以大功告成了。

    PCA降维分析,不仅可以展现我们的样品重复性,还可以用来发现内在的生物学规律。所以这次我们就围绕这两个主题开展今天文章的内容。

    PCA绘图及美化

    首先今天我们用的R包是ggord(https://github.com/fawda123/ggord)

    因为这个包并不放在CRAN中,所以直接用install.packages(“ggord”)是不可行的。

    所以我们需要在github上下载。

    #首先安装devtools

    install.packages('devtools')

    library(devtools)

    #我们再安装ggord

    install_github('fawda123/ggord')

    library(ggord)

    好的,接下来就要进入正题了,以我们的流程中的表达量总表为例

    列名为样品名称,分为A,B,C,D四组,每组4个生物学重复。

    行名为基因ID

    数值是RPKM值

    75bdb8f1038370ce95a0512f754d2198.png

    library(ggord)

    library(ggplot2)#我们需要一些ggplot2功能,如果需要ggsave保存的话

    getwd()#检查一下路径

    setwd("C:/Users/woney/Desktop")#将工作目录改成桌面

    pca_data=read.table("all.txt",header=T,sep="\t",row=1)#读取表格

    pca_data=t(as.matrix(pca_data))#将表达量总表反转,PCA函数计算的是展现的第一列的ID

    pca_group=factor(c(rep('A',4),rep('B',4), rep('C', '4'), rep('D', '4')))#分组,后续可以自己设置对应的组名,rep('组名','样品数')

    pca1=prcomp(pca_data,center=TRUE,retx=T)#prcomp是R自带的pca分析函数

    p1

    哒哒哒,出图如下

    30803d7892e046a5b3b3a3cd669a07b9.png

         
    然后,我们输入?ggord就可以查看具体的参数了。根据帮助文档的参数就可以自行修改。

    我简单列举一下我做的参数修改。

    变成多边形

    p2

    修改置信区间,以及将椭圆改成空心

    p3

    不展示点

    p4

    ea69f0fdb3e953ea7517a92ddd2be317.png

    此外,ggord是基于ggplot2基础上绘图,那么理论上ggplot2的图层语法是可以用的。

    比如加上标签

    library(ggplot2)

    p5=p1+geom_text(aes(label=rownames(pca_data)),vjust=1.5,colour="red")

    或者theme()主题都是可以的。总之ggord设置了大量的参数,都可以修改图形,其中作者也写了一些例子(https://github.com/fawda123/ggord)或者参考帮助文档中的参数(?ggord),可以帮助我们达成我们的目的。

    另类的PCA图

    那么第二点,我们如果想做成有线条和箭头来展现我们数据中的一些变量之间的关系呢。其实呢,在PCA中,最原始的就是会把其中的一些变量给展现出来,但是平时的分析中,我们都不会画出来,大家可以想象一下,当几万的基因代表的线条展现出来的时候。图形长什么样子。

    通过某个变量所代表的线条在PC1和PC2上的投影,我们可以看出这个变量对样本分离的贡献度,线条越长,代表投影越大,影响越显著,同时两个线条之间的夹角,可以理解为两个变量之间的相关性,夹角小于90度,可以认为两个变量正相关,大于90度,可以认为两个变量负相关。

    那么具体又该如何去画呢,其实用ggord是很简单去实现的。(其实ggord可以画很多图,有CCA,RDA,MAC,LDA等等)

    我们以16s测序为对象,我们的项目中会有一个表格对各个样本的α-多样性指数值数汇总,存于 04.alpha_diversity\summary.alpha_diversity.xls

    如果像展现环境因子与多样性指数之间的关系,可以把环境的理化因子放入其中。如下表

    e2c3b9885aebba53e6a70320248cb79e.png

    数据整理完,就可以开始画图了。

    library(ggord)

    library(ggplot2)

    getwd()#检查一下路径

    setwd("C:/Users/woney/Desktop")#将工作目录改成桌面

    pca_data=read.table("summary.alpha_diversity.xls",header=T,sep="\t",row= 1)#读取表格不需将表达量总表反转,PCA函数计算的是展现的第一列的ID

    pca_group=factor(c(rep('SN','3'),rep('SNP','3'), rep('SNPK','3')))#分组,后续可以自己设置对应的组名

    pca1=prcomp(pca_data,center=TRUE,retx=T)#prcomp是R自带的pca分析函数

    p1

    参数也是自己可以修改,结果如下:

    885de0ae992b2503e06b5f599beed2bb.png

    我们简单的可以推测,其中PH和TN影响最大,盐度与α-多样性指数呈负相关,温度呈现正相关。

    今天的内容就到这里啦~

    参考文献

    https://github.com/fawda123/ggord

    https://doi.org/10.1016/j.soilbio.2016.04.005

    ff471a284a85d5c4078afe639bfa8f32.png

    展开全文
  • 如图所示,想要增加外显示每模块的百分比分布,这R能做到吗?希望大佬能帮忙解答,感谢!![图片说明](https://img-ask.csdn.net/upload/201712/31/1514726982_459593.png)
  • 此文内容来自微信公众号:R语言搬运工,扫码关注公众号浏览更多精彩内容 在科研论文中,经常看到绘图后根据分组再点图外围加一圆圈或者多边形,这样的图怎样实现呢? 如下图: 图片源自文献Identifying ...

    此文内容来自微信公众号:R语言搬运工,扫码关注公众号浏览更多精彩内容

    在这里插入图片描述
    在科研论文中,经常看到有绘图后根据分组再点图外围加一个圆圈或者多边形,这样的图怎样实现呢?

    如下图:
    在这里插入图片描述
    图片源自文献Identifying sagittal otoliths of Mediterranean Sea gobies:variability among phylogenetic lineages

    展开全文
  • ![图片说明](https://img-ask.csdn.net/upload/202004/28/1588041562_186906.png) 借鉴的别人的代码
  • 如果两人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一朋友,请写程序求出这n个人一共多少朋友。 假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}},表示5个人,1和2是...

    2016年小米校招笔试第三题(西安站)

    假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
    假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。
    参考解法(Java版):<Q:316190672,欢迎交流>
    package XiaoMi;
    
    import java.util.LinkedList;
    import java.util.List;
    
    public class test17 {
        /*****************************************************************************************
         *@Author:guomutian911
         * 算法思想:每一对好友为一项,如{1,5},{3,7},{2,5}为三项。第一项中1为项的左值,5为项的右值。
         * 用布尔数组b[]标记遍历过的项,因为while循环是跳跃进行的,如上述关系所示,第一项为{1,5},因为
         * 第二项中无第一项中元素则跳跃至第三项。算法借助了两个集合:list放遍历过的元素,数组b放项标记。
         ****************************************************************************************/
        public static void main(String[] args) {
            int[][] r = { { 1, 5 }, { 3, 5 }, { 4, 5 }, { 1, 4 }, { 5, 6 },
                    { 8, 1 }, { 9, 20 }, { 98, 11 }, { 13, 76 }, { 98, 77 },{2,1} };
            friends( r);
        }
    
        /**
         * 根据二维数组输出朋友圈
         * @param r 关系数组
         * @return void
         * */
        static void friends(int[][] r) {
            boolean[] b = new boolean[r.length]; //标志是否遍历过,并加入朋友圈集合中
            int s = r[0][0]; //从第一项左边开始遍历
            List<Integer> list = new LinkedList<Integer>(); //插入操作多所以使用LinkedList
            boolean flag = true; //判断循环条件是否终止,while停止标记
    
            b[0] = true; //从第一项开始,表示已经遍历过,并加入集合所以设置为true
            while (flag) {
                list = new LinkedList<Integer>();
                list.add(s); //加入一项中的左或右值
                for (int j = 0; j < list.size(); j++) {
                    int key = list.get(j); //从头遍历list
                    for (int i = 0; i < r.length; i++) {
                        if (r[i][0] == key) { //从头遍历所有项,分别取其左右值同list中key值比较
                            if (!list.contains(r[i][1])) { //list中有左边值,无右边值(若用set则不用判断)
                                list.add(r[i][1]); //加入右边值
                            }
                            b[i] = true; //标记该项已遍历
                        } else if (r[i][1] == key) { 
                            if (!list.contains(r[i][0])) { //list中有右边值,无左边值
                                list.add(r[i][0]); 
                            }
                            b[i] = true; //标记该项已遍历
                        }
                    }
                }
    
                System.out.println(list); //输出一条朋友圈
                
                //while循环为跳跃前进,所以需要对标记数组从头遍历
                for (int i = 0; i < b.length; i++) {
                    if (b[i] == false) {
                        s = r[i][0]; //如果没有遍历过,则定位到该处
                        break; //结束for循环,继续上一步while循环
                    }else if (i == b.length - 1&&allScan(b)) //使用短路与,减少复杂度
                        flag = false; //停止while循环
                }
            }
        }
    
        /**
         * 判断一个boolean数组里面的值是不是全为true
         * @param b 接受的数组
         * @return boolean 如果数组全为true返回true
         * */
        static boolean allScan(boolean[] b){
            for(int i=0;i<b.length;i++){
                if(b[i] == false){
                    return false;
                }
            }
            return true;
        }
    }


    运行结果:
    [1, 5, 4, 8, 2, 3, 6]
    [9, 20]
    [98, 11, 77]
    [13, 76]

    展开全文
  • 这样一道面试题它是这样描述的:假设n个人m对好友(存于二维数组r),如果两人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一朋友,请写程序求出这n个人一共多少朋友?  例:n=5,m=3,r=...

        有这样一道面试题它是这样描述的:假设有n个人m对好友(存于二维数组r),如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈?

        例:n=5,m=3,r={{1,2},{2,3},{4,5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1,2,3属于同一个朋友圈,4,5属于同一个朋友圈.结果为两个朋友圈.

        如何去分析这道面试题呢?这就用到并查集这种数据结构.

    并查集>

       将N个不同的元素分成一组不相交的集合,开始时,每个元素就是一个集合,然后按规律将两个集合进行合并,在合并的过程中要不断的查找这个元素属于哪个集合.

       

        在统计朋友圈的数量的时候只需要统计负数的个数即可.

        

    #pragma once
    
    class UnionSet
    {
    public:
    	UnionSet(int size)
    		:_size(size+1)
    	{
    		_a=new int[size+1];
    		memset(_a,-1,sizeof(int)*(size+1));
    	}
    	~UnionSet()
    	{
    		delete[]_a;
    		_size=0;
    	}
    	void Merge(int x1,int x2)
    	{
    		int root1=_GetRoot(x1);
    		int root2=_GetRoot(x2);
    		if(root1 != root2)
    		{
    			_a[root1] += _a[root2];
    			_a[root2] = root1;
    		}
    	}
    	int CountFriends()
    	{
    		int count=0;
    		for(int i=0;i<_size;++i)
    		{
    			if(_a[i] < 0)
    			{
    				count++;
    			}
    		}
    		return count-1;
    	}
    protected:
    	int _GetRoot(int index)
    	{
    		int root=index;
    		while(_a[root] >= 0)
    		{
    			root=_a[root];
    		}
    		return root;
    	}
    protected:
    	int *_a;
    	int _size;
    };
    
    void testUnionSet()
    {
    	const int n=5;
    	const int m=4;
    	int a[m][2]={{1,2},{2,3},{4,5},{1,3}};
    	UnionSet unionset(n);
    	for(int i=0;i<m;++i)
    	{
    		unionset.Merge(a[i][0],a[i][1]);
    	}
    	cout<<"Friends:"<<unionset.CountFriends()<<endl;
    }


       在这里就分享结束啦~~~

    展开全文
  • j++) { if(str[j]=='A'||str[j]=='B'||str[j]=='D'||str[j]=='O'||str[j]=='P'||str[j]=='Q'||str[j]=='R') { if(str[j]=='B') { count+=2; } else { count++; } } } ...
  • R

    千次阅读 2017-08-08 20:39:13
    http://www.cnblogs.com/1zhk/p/4762061.html
  • f(RRμν2)

    2020-05-03 20:51:56
    我们在爱因斯坦背景下,用一般形式为f(RRμνRμν)的拉格朗日算术在重力理论中计算单环发散。 我们还确定,在改变量度和量子涨落场之间关系的某些参数的对偶下,单环有效作用是不变的。 最后,我们讨论这种理论...
  • 文章目录一、环境需求RRstudio 的安装配置RCircos安装二、绘制图0.载入包1.绘制人染色体图2.绘制基因5.绘制折线图6.绘制网络图7.添加和弦图三、导出PDF 成品预览: 一、环境需求 RRstudio 的安装配置 ...
  • 约瑟夫环算法是: n 个人围成一,每人都互不相同的密码,该密码是一整数值,选择一人作为起点,然后顺时针从 1 到 k(k为起点人手中的密码值)数数。数到 k 的人退出圈子,然后从下一人开始继续从 1...
  • R代码的复杂度 循环复杂度是一种软件度量标准(度量),用于指示程序的复杂性。 它是对程序源代码中线性独立路径数量的定量度量。 它是由托马斯·J·麦卡比(Thomas J. 安装 devtools :: install_github( " ...
  • 求朋友圈个

    千次阅读 2013-06-05 16:09:55
    如果两人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一朋友,请写程序求出这n个人一共多少朋友。 假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示5个人,1和2...
  • 人如何“破”?

    千次阅读 2020-09-18 10:07:55
    随着一人活动范围的确定,慢慢地大家的活动就形成了一个个的”圈子“,如演艺,学术等。这些圈子的形成与划分,就是根据每人的活动范围和行为特征对人群的一次分类划分,正所谓物以类聚,人以群分。这些群或...
  • 更新至R 4.0.2 版本RRStudio 的安装是非常简单的,这里提供一些安装 Tips。在文章的最后我还通过一案例带大家走进奇幻的 R 世界。视频讲解该视频较老,但是可以参考~安装 R❝下载页面:...
  • 如果两人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一朋友,请写程序求出这n个人一共多少朋友。假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示5个人,1和2...
  • 1小圆半径1,1大圆半径3,小圆绕着大圆转1,问小圆自转几 设小圆半径为r,以大圆圆心为观察点,小圆的圆心绕过了距离S = (1+3)πr = 4πr, 则自转圈数Rotation= S/2πr =4 视觉实现: ...
  • 朋友

    2018-03-29 20:43:11
    俱乐部的学生有着一定相似的兴趣爱好,形成一朋友。一学生可以同时属于若干不同的俱乐部。根据“我的朋友的朋友也是我的朋友”这推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友。请...
  • 题目: 输入一矩阵,按照从外向内圈顺时针打印数组元素。例如输入二维数组 a[3][3] = {{1,3,4}, {5,6,7}, {8,2,0}},打印出来的结果应该是:1 3 4 7 0 2 8 5 6解决思路:(1)首先,本文实现的顺时针打印,起始...
  • //2015.3 n小朋友围城一,玩击鼓传花游戏,将小朋友编号1-n,从1号开始传花, // 每次传3,拿到花的小朋友表演节目后退出,任给n,问最后一小朋友的编号是多少。 // 例如:5小朋友,1号开始传花,第一...
  • R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育...
  • 这段的打算是在基因组图里表示变异位点和基因名。成品这样子,数据我编的...#虽然circlize包前3列是bed文件,bed第一列的染色体号时候是"chr1",时候是“1”,这里要用带chr的 head(data) library(circliz
  • 如果两人是直接或间接的好友(好友的好友的好友…),则认为他们属于同一朋友,请写程序求出这n个人一共多少朋友。 假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示5个人,1和2...
  • 通过在标准模型下对双光子碰撞产生r+r-的弱电辐射修正--包括虚修正和软光子修正的计算,得到了单圈修正下rr-r+过程的散射截面,并讨论了树图和单圈弱电修正下散射截面随质心能蚋变化关系的比较。本项研究对实验测量...
  • 学好R语言绘图,你只需这样一网站就够了

    千次阅读 多人点赞 2020-04-19 09:35:08
    你们是否超级羡慕那些能做一手好图的人,俗语云一图胜千言,做了一手好图很容易提升我们文章的逼格。所以我也常常在想,网络上那种可视化的示例代码和示例...r-garp-gallery收入了大量利用R语言绘制的图形,...
  • 常规的并查集是让你找是否连成或者连成几个圈或者让你找老大的个数 这一题是让你在一老大的情况下(需要判断)判断是否存在的问题! 还有就是这一题没有告诉你点,所以你需要将已知的点标记一下! 一...
  • 亥姆霍兹线圈(Helmholtz coil)是一种制造小范围...亥姆霍兹线圈是一对彼此平行且连通的共轴圆形线圈,两线内的电流 方向一致,大小相同,线圈之间的距离 d 正好等于圆形线圈的半径 R 时,这种圆形载流线称为He...
  • 最近迷上吃鸡游戏,慢慢对他的跑机制产生了兴趣,于是就试着写了吃鸡游戏跑机制出来~~~ 一、话不多少,先上跑效果图:   二、知识提要:  1.C# winform程序中比较简单的绘图控件就是 PictureBox  ...
  • 模仿微信朋友的拖拽旋转圆圈 我们就需要一圆圈和一ScrollView 圆圈我就不写了  ScrollView sv = (ScrollView) findViewById(R.id.sv);  sv.setOnTouchListener(new View....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,663
精华内容 46,265
关键字:

圈里有个r