最近工作遇到了需要大量绘制同种类型图片的重复性任务,用Excel着实伤不起,而且如果遇到一些数据上的改动,又得重来一遍。故又重新搬出了ggplot2,将用到的一些方法与走的弯路做一下总结。我们将用R自带iris数据集进行图形的绘制。
一般公司中,对于ppt的制作都有固定的模版,且对图表的颜色也做了相应的约定。所以用R绘图的第一步,自定义好我们需要的颜色。我这里使用的是rgb函数,前三个参数分别对应红绿蓝三个颜色通道,maxColorValue 表示颜色通道取值范围的最大值,常取255。
ye = rgb(228,184,45,maxColorValue=255)
re = rgb(227,106,76,maxColorValue=255)
gre = rgb(97,169,113,maxColorValue=255)
本次我们使用ggplot2绘图,而在ggplot2中,在坐标的颜色映射中aes(color=**)
,此处的颜色是默认的,如需更改,需要指定颜色,将颜色映射到对应的类别。
myColors = c(ye,re,gre)
names(myColors) <- unique(iris$Species)
co = scale_colour_manual(name='Species',values = myColors)
这里用的是ggplot2中的scale_colour_manual
函数。ggplot2中有很多关于颜色映射的函数,一定要用对,否则可能不成功(我最开始使用的scale_fill_manual
,一直失败)。在scale_colour_manual
中,第一个参数指定图例的名字(映射的颜色会显示在图例中),第二个参数为对应的颜色映射。
p = ggplot(data = iris,aes(x=Sepal.Length,y=Sepal.Width,group = Species,color = Species))+
geom_point(size=1.2)+
geom_line(size=1.2)+#size 线条粗细
xlab("Sepal.Length")+#横坐标名称
ylab("Sepal.Width")+#纵坐标名称
theme_bw()+ #去掉背景灰色
ggtitle('iris') +#设置标题
theme(plot.title = element_text(hjust = 0.5),text = element_text(size=15))+#标题居中,size控制标签文字大小
co+
theme(panel.grid.major=element_line(colour=NA),
panel.background = element_rect(fill = "transparent",colour = NA),
plot.background = element_rect(fill = "transparent",colour = NA),
panel.grid.minor = element_blank(),#以上theme中代码用于去除网格线且保留坐标轴边框
text = element_text(family = "STXihei"),#设置中文字体的显示
legend.position = c(.075,.915),#更改图例的位置,放至图内部的左上角
legend.box.background = element_rect(color="black"))+#为图例添加边框线
如若需要在图片中加入一条标识线,可使用geom_vline添加与y坐标轴平行的线,geom_hline添加与x坐标轴平行的线。xintercept,color,linetype分别控制线条的x坐标,颜色以及形状。
+geom_vline(xintercept = **,color='red',linetype='dashed)
如若需要在图片中添加注释,推荐使用annotate,其中geom为需要控制的对象类别,如果是添加文字,则选择‘text’,x为label的x坐标,label:具体需添加的文字,color:字体颜色,size:字体大小。
+annotate(geom='text',x=**,label='**',color='red',size=3)
将图画出来后,接下来一步就是将图保存。R studio里有多种图片的保存,最简单的一种就是直接在右下角,图片的显示框内右键保存。但是我们要批量生产图片,如果一张一张地保存图片显然不可取,故得另寻方法。
另一种方法为jpeg
函数,这种方法适用性更高,但我做出来效果不好,图片清晰度不够高。应该有别的改进参数,但未深究。代码如下:
jpeg(filename='iris.png',width=800,height=400,quality=100)
print(p)
dev.off()
其中filename为图片保存的名字,width,height分别对应图片的宽度和高度,quanlity图片输出质量。dev.off()关闭设备
这里需注意的是,最初 我在jpeg和dev.off()之间直接放的ggplot2绘图函数,但图片没有成功输出。后将其赋值给某变量再print,图片成功输出le。
最后一种图片保存方法,也是推荐使用的,是ggplot2自带的图片保存方法,输出图片质量较高,方法如下
ggsave('iris.png',p, width = 8, height = 4)
同样width和height分别表示图片的宽和高。
这里我用的是plyr中的ddply函数,将画图流程打包成一个函数,在用ddply进行分组绘图,函数的具体应用可网上自行查阅,不在细说。