之前画图用的都是师兄写好的流程,这次需要自己画一些简单的图了,中间涉及学到的一些小知识就都放这里啦,初学者,内容不是很全。
library(ggplot2)#这个应该都知道,载入R包
1)图例设置
theme(legend.background =element_rect(fill = "white",colour = "black")) #给图例加边框
theme(legend.position="bottom",legend.key.size= unit(5, "pt")) #默认图例是在右边的,这里自定义设置图例位置在下方(“bottom”),大小为5
guides(color = FALSE)#按颜色分组后,不显示颜色分组的图例
theme(legend.title=element_blank()) #不显示图例的标题
2)坐标轴(ggplot2——坐标系篇 - (jianshu.com) 这里很详细)
theme(axis.line=element_line(colour="black")) #设置坐标轴为黑色
ylim(0,4) + xlim(0,8) #设置坐标轴范围
labs(x="x轴名称",y="y轴名称") #设置坐标轴名称
coord_fixed(ratio = 数字) #当刻度太密集挤在一起时,用这个拉长坐标轴
scale_x_continuous(limits=c(0,1),breaks=seq(0, 1, 0.05)) + scale_y_continuous(limits=c(0,1),breaks=seq(0, 1,0.05)) #设置坐标轴范围和间隔
theme(axis.text.y = element_blank()) #设置axis.text.y则只删去 Y 轴的刻度标签,X 轴同理
theme(axis.text.y =element_blank()) #隐藏Y轴的刻度文本(axis.ticks)
theme(axis.ticks=element_blank()) #隐藏坐标轴的刻度线(只能x轴和y轴一起隐去)
3)背景
theme(panel.grid=element_blank()) #去掉背景里的网格线
theme_set(theme_bw()) #设置背景为白色
theme_classic() #ggplot里的一个主题,不要周围的边框只要两个坐标
4)分别在图中添加横向虚线和竖向虚线(下图代码表示,过(0,0)的红色直线,粗细为0.5)
geom_hline(yintercept=c(0,0),color="red",size=0.5,linetype="dotted")+ geom_vline(xintercept=c(0,0),color="red",size=0.5,linetype="dotted")
5)因为有图例的存在,原来应该是正方形的图可能实际不是正方形,加上这个保持
+ coord_fixed()
6)画散点图:
ggplot(data=data1, aes(x=h1,y=h2, color= in_all, group=1))
或者:ggplot(data=data1, aes(h1,h2, color= in_all))
#x轴为h1的数据,y轴为h2的数据,根据in_all这一列的数据分组,默认会给不同分组不同颜色,也可以自定义颜色(往下看);
# 也可以用形状表示分组,就是把这里的color改成shape;
# 同时用形状和颜色表示分组(比如3组数据分别用绿色圆,红色方,蓝色三角表示——不同分组的颜色和形状都不同)可以是:(color=in_all, shape=in_all),当然这样的话还是会自动给颜色和形状,想自定义的话再加上函数: scale_colour_manual 和scale_shape_manual (见下述)
#这里 group=1 也可以不写,个人试了下感觉没有影响,但是有时候画折线图但是点不能被连接起来,加上group=1就可以了
7)设置点的大小
geom_point(size=3)
geom_point(stat= "identity", aes(size=var), alpha =0.5, show.legend = TRUE) + scale_size(range = c(0.1,1.8),guide=FALSE) #根据var列的数值,设置点的大小(从0.1到1.8大)
8)自定义不同分组的颜色
scale_colour_manual(values =c("blue", "red"))
scale_color_manual(values=c(rep("blue",19),rep("green",19),rep("yellow",19),rep("red",19),rep("black",7))) #红色重复19次,绿色重复19次…..黑色重复7次
9)自定义不同分组的形状
scale_shape_manual(values =rep(1:83, len = 83)) #R的形状只有25种,要使用多于25的形状,会用符号和字母代替,比如这里,要使用83种——但是第26-32种形状总是报错无法显示,不知道为啥
scale_shape_manual(values=rep(0:18,5)) #0-18的形状,重复使用5次 (这里19和21的形状我真不懂有啥不同,反正我画出来是一样的,可能是透明度啥的吧,所以就只用了0-18的图案)
10)同时用不同颜色和形状表示分组:如绿色三角、红色三角、黄色三角、绿色圆、红色圆、黄色圆分别代表不同的数据(这样就可以表示25以上的分组,且自定义颜色不用使用渐变色)
ggplot(data1,aes(h1,h2)) + geom_point(aes(shape=id, col=color)) +scale_colour_manual(values= c("blue", "red", "green"))+scale_shape_manual(labels= labels, values = c(0,15,1,16,0,15,1,16,0,15,1,16))+guides(shape =guide_legend(override.aes = list(color = rep(c('blue', 'red', 'green'), each =4))),color = FALSE)
#0,15,1,16这四种形状,分别用蓝色,红色,绿色表示,这里一共表示了id列有3*4=12个数据,但是这样写需要数据量能够= n * n,如果有83个数据呢?
#且这里需要新建一列名为color的列(相当于给一个新的分组),这里是形状根据id分组,颜色根据color列分组,比如这里的12个数据,color列的内容可以为:(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),超麻烦有木有!
ggplot(data1, aes(h1,h2)) +geom_point(aes(shape=id, col=id)) +scale_color_manual(values=c(rep("blue",19),rep("green",19),rep("yellow",19),rep("red",19),rep("black",7)))+scale_shape_manual(values=rep(0:18,5))
#需要注意,scale_color_manual里面,颜色的数量一定要与实际数据的数量一致,比如id列有83个数据:19*4+7=83;scale_color_manual里一定要>=83
#可以实现和上面那个一样的功能而且写起来简单多了
11)然而我最终还是画的别的,代码如下:
ggplot(data=data1,aes(x=h1, y=h2, color= all,group=1))+geom_point(size=3) + scale_colour_manual(values = c("blue","red")) + xlim(-1,1) + ylim(-1,1) +geom_hline(yintercept=c(0,0),color="red",size=0.5) +geom_vline(xintercept=c (0,0),color="red",size=0.5) + coord_fixed()
12)批量画图(这里的是看到来自于另一篇R语言循环多个文件画图生成一个or批量生成多个pdf文件 - (jianshu.com),这里讲的比下面详细)
每个数据文件生成一张图:
for (i in dir("画图用的数据所在的文件的全路径")){
name_pre2 <- unlist(strsplit(i, "-"))[1] #比如数据是R_data1.tab-new.txt,我希望最后画出来的图的名字是data1,这里就以 - 符号分割,取出R_data1.tab
name_pre1 <- unlist(strsplit(name_pre2, "_"))[2] #取出data1.tab
name=sub(".tab","",name_pre1) #我其实不是很理解这里,但是这里是取出了data1。不能用上述方法取,因为如果是用 . 分割,. 代表全部,会出错
cc <- paste("画图用的数据所在的文件的全路径","/",i,sep="") #正确的找到文件的路径和名称,但是我不是很理解emmm
p<-ggplot(画图的代码)
ggsave(p,file=paste(name,".jpg",sep="")) #也可以选择保存为“.pdf”等
}