【R作图】lattice包,画多个分布柱形图,hist图纵轴转换为百分比
一开始用lattice包,感觉在多元数据的可视化方面,确实做得非常好。各种函数,可以实现任何想要实现的展示。
| barchart(y ~ x) | y对x的直方图 |
| bwplot(y ~ x) | 盒形图 |
| densityplot(~ x) | 密度函数图 |
| dotplot(y ~ x) | Cleveland点图(逐行逐列累加图) |
| histogram(~ x) | x的频率直方图 |
| qqmath(~ x) | x的关于某理论分布的分位数-分位数图 |
| stripplot(y ~ x) | 一维图,x必须是数值型,y可以是因子 |
| qq(y ~ x) | 比较两个分布的分位数,x必须是数值型,y可以是数值型,字符型,或者因子,但是必须有两个"水平" |
| xyplot(y ~ x) | 二元图(有许多功能) |
| levelplot(z ~ x*y) contourplot(z ~ x*y) |
在x,y坐标点的z值的彩色等值线图(x,y和z等长) |
| cloud(z ~ x*y) | 3-D透视图(点) |
| wireframe(z ~ x*y) |
同上(面) |
| splom(~ x) | 二维图矩阵 |
| parallel(~ x) | 平行坐标图 |
下面详细介绍下xyplot,xyplot相当于plot,不过可以画多个子图。
一.不过如果想要在每个子图里展示几种点或线,就要想想办法了。
1)这是一个利用公式关系的方法:Sepal.Length + Sepal.Width ~ Petal.Length + Petal.Width能在一个子图中画出
Sepal.Length ~ Petal.Length,Sepal.Width ~ Petal.Length,Sepal.Length ~ Petal.Width,Sepal.Width ~ Petal.Width四种关系

*代码:
library(lattice)
require(stats)
xyplot(Sepal.Length + Sepal.Width ~ Petal.Length + Petal.Width | Species,
data = iris, scales = "free", layout = c(2, 2),
auto.key = list(x = .6, y = .7, corner = c(0, 0)))
2)下面是另一种方法,利用groups参数:

*代码:
xyplot(freq~abun |KO ,groups=country,data =zz, type="o", layout = c(4, 6),xlab="Abundance (log10)",ylab="Frequency",scales="free")
不过我想要画hist分布图,所以尝试了几种不同方法:
1)barchart:可惜柱子的透明度无法调节

*代码:
barchart(freq~abun |KO ,groups=country,data =zz,stack =T,strip=T, layout = c(2, 2),xlab="Abundance (log10)",ylab="Frequency",scales="free",col=rainbow(2,alpha=0.5),box.ratio =100,horizontal=F)
2)想用xyplot 函数,把type改成“h”柱形,但是 lwd 这个参数没法每个子图不一样,lend参数无效 。

*代码:
xyplot(freq~abun |KO ,groups=country,data =zz, type="h", lwd = 10, lend =2, layout = c(4, 6),xlab="Abundance (log10)",ylab="Frequency",scales="free",col=rainbow(2,alpha=0.5))
3)经过一番研究,用histogram函以及函数中的panel(子图中加函数)可以实现,但是发觉xlim无法各个子图自己调整,最后无奈选择最原始的方法。

*代码:
histogram(~abun |KO ,data=zz , layout = c(4, 6),xlab="Abundance (log10)",ylab="Frequency",scales="free",col=rainbow(2,alpha=0.5)[1],
panel = function(x, ...) {
panel.histogram(x[1:100],breaks=NULL,type="count",col = rainbow(2,alpha=0.5)[1])
panel.histogram(x[101:160],breaks=NULL,type="count",col = rainbow(2,alpha=0.5)[2])
}
)
4)最原始的方法:

*代码:
par(mfrow=c(6,4),mar=c(2.1,2.1,0.1,0.1))
for (i in 1:length(id))
{
tmp=log10(as.numeric(data[id[i],2:161]))
a=hist(tmp,breaks=10,plot=F)
b=hist(tmp[1:100],breaks=a$breaks,plot=F)
c=hist(tmp[101:160],breaks=a$breaks,plot=F)
if((max(b$count)/100)>(max(c$count)/60)){
hist(tmp[1:100],breaks=a$breaks,col=rainbow(2,alpha=0.5)[1],xlab="",ylab="",main="");
e=hist(tmp[101:160],breaks=a$breaks,plot=F)
e$counts = e$counts*100/sum(e$counts)
plot(e,add=T,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="")
}else{
e=hist(tmp[101:160],breaks=a$breaks,plot=F)
e$counts = e$counts*100/sum(e$counts)
plot(e,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="",border=0)
hist(tmp[1:100],breaks=a$breaks,add=T,col=rainbow(2,alpha=0.5)[1],xlab="",ylab="",main="");
plot(e,add=T,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="")
}
}
最后终于大功告成,里面还有很多地方值得仔细研究。
例如:
i.我两组样品的数量不一样,但是我想在一个hist图中比较,怎么办?hist纵轴百分比显示!!!
e=hist(tmp[101:160],breaks=a$breaks,plot=F)#先hist存到变量中
e$counts = e$counts*100/sum(e$counts) #将counts转换成百分比
plot(e,add=T,col=rainbow(2,alpha=0.5)[2],xlab="",ylab="",main="")#再画图
ii.我画两个具有一定透明度的hist,发觉画图先后顺序对重叠部分的颜色有影响,例如我先画红色再画蓝色vs.先画蓝色再画红色,结果就不一样了。

但是我又需要让x轴和y轴依据最大的图来确定。
所以我先根据所有数据来取breaks,保持两个hist的break一致,这样x轴问题就解决了;
然后判断哪个hist的y值最大,那么我先根据最大的那个画一个空白的hist,y轴问题解决;
然后再按照先红后蓝的顺序画上两个hist。
【R作图】lattice包,画多个分布柱形图,hist图纵轴转换为百分比的更多相关文章
- 使用R的networkD3包画可交互的网络图
d3network包code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs & ...
- R语言diagram包画订单状态流图
代码如下: library("diagram") #a <- read.table(file="clipboard",header=TRUE) write ...
- R语言 ggplot2包
R语言 ggplot2包的学习 分析数据要做的第一件事情,就是观察它.对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测? ggplot2图形之基本语法: ggplot2的核心理念是将 ...
- R语言常用包汇总
转载于:https://blog.csdn.net/sinat_26917383/article/details/50651464?locationNum=2&fps=1 一.一些函数包大汇总 ...
- 安装R语言扩展包vegan
这周的作业我开始得好迟啊...然而还是要努力做啊... ××××××××××××××我是萌萌哒分割线×××××××××××××××××××××××××××××××××××× 首先,百度进入官方页面,看 ...
- R语言-Knitr包的详细使用说明
R语言-Knitr包的详细使用说明 by 扬眉剑 来自数盟[总舵] 群:321311420 1.相关资料 1:自动化报告-谢益辉 https://github.com/yihui/r-ninja/bl ...
- 每R一点:各种画地图,全是知识点,90%人不知道!(转)
R语言绘制地图,在数据分析中经常能够用到,并且会达到非常好的展示效果,本节以例子形式,介绍如何使用R语言工具,画出理想的地图. 本节例子在 R version 2.15.3版本下运行顺畅,其他版本待定 ...
- R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)
要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 在之前的开篇提到了text2vec ...
- R语言-神经网络包RSNNS
code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...
随机推荐
- HDU1711 Number Sequence KMP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU1711 题意概括 给T组数据,每组有长度为n和m的母串和模式串.判断模式串是否是母串的子串,如果是输出 ...
- BZOJ1191 [HNOI2006]超级英雄Hero 二分图匹配
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1191 题目概括 有m个题目,有n个解决方案:对于每一个题目,有两种解决方案可用. 每种解决方案只能 ...
- BZOJ1076 [SCOI2008]奖励关 概率 状态压缩动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1076 题意概括 有n个东西,k次扔出来.每次等概率扔出其中一个. 你可以拿这个东西,但是有条件,得 ...
- 【Java】 剑指offer(59-2) 队列的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请定义一个队列并实现函数max得到队列里的最大值,要求函数ma ...
- X分钟速成Python3
参考博客:Python3 从入门到开车 (与以下代码无关) 源代码下载: learnpython3-cn.py Python是由吉多·范罗苏姆(Guido Van Rossum)在90年代早期设计. ...
- Dart语言特性必备了解!
学习Dart语言,必须将以下的概念熟记于心: 在dart语言中,一切皆为对象.所有的对象都是一个类的实例.甚至整数.函数.null也看做是对象.所有的对象都继承于Object类 尽管Dart是强类型语 ...
- 【*】Redis实战场景中相关问题
一.Redis简介 redis主要解决的问题 分布式缓存是分布式系统中的重要组件,主要解决高并发.大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问. 使用缓存常见场景 项目中部分数据访问 ...
- Java中递归和循环的优劣
介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归 ...
- 前端必备HTTP技能之HTTP请求头响应头中常用字段详解(转)
作为一名前端开发人员,肯定少不了要和网络打交道,因为要从服务器端拉取数据,从服务端获取数据最常用的方式还是通过HTTP请求.给服务器发请求的时候有请求头,接受服务器响应的时候有响应头,客户端和服务器端 ...
- 4067: [Ctsc2015]gender 动态规划 网络流
国际惯例的题面:首先这题是缺少两个隐藏条件的:第一个是这k条链的起点和终点所在的层是对齐的,也就是说不会出现两条链错开的情况,且这张图恰好由n层组成:第二个就是任意一个点都包含在与链上的点直接或间接相 ...