#美化ggplot2生成的原始图片至清爽的感觉_weixin_38974336的博客-程序员秘密

技术标签: python  ggplot2  数据分析  r语言  数据分析log  数据可视化  

美化ggplot2生成的原始图片至清爽可出版的样子

针对于ggplot2的可视化教程网上有很多,展示了很多ggplot2的图示,根据代码照猫画虎我们都可以去复原,但复原出来的图会有一些粗糙感。如何优雅的将这些图形应用到生产实际中呢,网上的资料并没有系统的说明,那今天来演示一下,希望起到抛砖引玉的作用。

在这里插入图片描述

在数据分析领域,数据可视化是数据分析师所需具备的一个很重要的技能,论便捷程度excel作图当属第一,但涉及到图形多样性及可定制性的话,R语言和python 是首当其冲的好工具。由于工作需要,笔者经常需要多个工具切换使用,个人认为在可视化上还是R语言更胜python一筹,本文主要由R语言的ggplot2包说起,当然所碰到的问题也是从ggplot2开始。

背景

咱们还是先假定一个场景。有以下的数据,需要展示出每日各个水果的销量(sold_amount),及购买用户数(customers)。考虑到图形传递信息的丰富度,我们用ggplot2来执行这项任务。

在这里插入图片描述

笔者刚接触ggplot2时也惊叹于他的各种示例图片,但实际工作中,又发现这些示例又有一些华而不实,想象一下借助ggplot2的示例,如果你把图做成这样放到你的汇报或总结里, 可能会有一些尴尬,懂得人知道你确实用到了很多的ggplot知识,不懂得人可能就会说,这图好丑呀?好吧 确实很丑,而且你用到了这些知识但没用好等于不会

library(ggplot2) ##做图
library(reshape2) ##揉数据

data <- read.table('clipboard',header = TRUE,stringsAsFactors = FALSE)  #将长条形数据读入,这里直接用剪切板读了。
data$date <- as.Date(data$date,'%m/%d')  #将日期列识别出来
data_melt <- melt(data,id.vars = c("date","goods_type"))  #需要把数据揉成ggplot所需要的长表数据:日期列(date),水果名(goods_type),变量列(销量,顾客数),变量对应的值
head(data_melt)
##ggplot的常规默认作图
p <- ggplot(data_melt,aes(date,value,group = goods_type,color=goods_type)) + ##基本图形元素 
  geom_line()+  ##加入线形
  facet_grid(variable~.,scales = 'free_y')+ ##调整分图y轴值范围
  scale_x_date(date_breaks = "1 day", date_labels =  "%m-%d")+ ##设置x轴lab的样式
  theme(axis.text.x=element_text(angle=60, hjust=1)) ##设置x轴lab的位置和间距。
p

在这里插入图片描述

解决方案

咱们先来分析一下,这个图为什么会丑。

  1. 首先从整体上来说,ggplot2的默认风格可能各大部分的实际场景都不是那么的搭配。
  2. 由于数据的波动较大(随机生成的数据没办法),线条是很零乱的,仔细去分析的话,线条也能反应出销量和用户数的变化,但是分析师出产的应该是让人容易接受的优美的东西,所以能不能呈现优雅的凌乱?
  3. 整体布局,字体和图形元素位置的调整
  4. 分辨率问题,这个我觉得挺影响观赏效果。

实操

  1. 针对第一个问题:很好解决,ggplot2有很多主题供我们选择,这里我们选择theme_light,看下效果先:

    ###美化后 +theme
    p <- ggplot(data_melt,aes(date,value,group = goods_type,color=goods_type)) + 
      geom_line()
      facet_grid(variable~.,scales = 'free_y')+
      scale_x_date(date_breaks = "1 day", date_labels =  "%m-%d")+
      theme_light()+  ###调用ggplot自带的一些theme 
      theme(axis.text.x=element_text(angle=60, hjust=1))
    p
    

在这里插入图片描述

  1. 针对第二个问题:我们参考excel的点线图去做,也很优雅。看看效果:

    ##+点线
    p <- ggplot(data_melt,aes(date,value,group = goods_type,color=goods_type)) + 
      geom_line(linetype="solid",size=0.8)+  ##更改线型 线粗
      geom_point(size=2)+   ##加入点 并调整点的大小
      facet_grid(variable~.,scales = 'free_y')+
      scale_x_date(date_breaks = "1 day", date_labels =  "%m-%d")+
      theme_light()+
      theme(axis.text.x=element_text(angle=60, hjust=1))
    p
    

在这里插入图片描述

  1. 针对第三个问题:就得看自己的审美了。调整布局,字体,图例类型 及摆放位置,再加上一些标题,副标题。

    ##美化后。+修改字体,及图例位置
    p <- ggplot(data_melt,aes(date,value,group = goods_type,color=goods_type)) + 
      geom_line(linetype="solid",size=1.2)+
      geom_point(size=2)+
      facet_grid(variable~.,scales = 'free_y')+
      scale_x_date(date_breaks = "1 day", date_labels =  "%m-%d")+
      theme_light()+
      theme(axis.text.x=element_text(angle=60, hjust=1))+
      ggtitle("Daily data of goods_type\n")+
      xlab("Date") + ylab("Value")+
      theme(
      		##图形标题设置 字体和大小
      		plot.title = element_text(family='Times', face='bold.italic',size = 36),
      		##x坐标轴
            axis.title.x = element_text(family = 'Times',face = 'bold',size =27),
            ##y坐标轴
            axis.title.y = element_text(family = 'Times',face = 'bold',size=27),
            ##图例标题
            legend.title = element_text(family = 'Times',face = 'bold',size=26),
            ##图例内的字体
            legend.text = element_text(family = 'Times',face = 'bold',size=20),
            ##分面或分幅字体
            strip.text = element_text(family = 'Times',face = 'bold.italic',size=27),
            ##图例位置
            legend.position="bottom"
            )
    p
    

在这里插入图片描述

  1. 针对第四个问题:Rstudio提供了很好的设置图形大小的工具,也可以直接导出为矢量图的形式,这样更保真。不过我在日常工作中经常会使用先保存为pdf的形式,然后通过pdf工具导出相应的图,大家有空可以试一下,我常用的设置是导出为横向A4纸大小的pdf,然后通过pdf工具导出相应分辨率(最好300dpi以上)的图片,出来的效果如下:

在这里插入图片描述

小结

当然,这个分享主要是针对于对R语言的ggplot2包 或python里的ggplot2包有了解的同学,关于ggplot2有很多有用和好用的东西值得去钻研和分享,希望大家共同努力。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38974336/article/details/115877660

智能推荐

Android APK加固原理_android app加固_葡萄使徒的博客-程序员秘密

Android作为开源框架,开放之余,所要面临的就是安全问题,世间之事,有正就有邪,有攻就有守,作为开发者虽然不需要进入专业安全领域,但还是需要掌握基本的安全常识和原理。

python学习之删除DataFrame某一行/列内容_dengfei4999的博客-程序员秘密

用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)参数说明:labels 就是要删除的行列的名字,用列表给定axis 默认为0,指删除行,因此删除columns时要指定axis=1;index 直接指定要删除的行columns 直接指定要删除的列inplace=False,默认该...

npm 镜像配置还原_npm还原_心歌技术的博客-程序员秘密

1、npm查看镜像配置地址npm get registry2、还原npm镜像配置npm config set registry https://registry.npmjs.org/3、查看npm镜像配置,我们会发现已经变了npm get registry

YOLOv5训练-wandb_yolov5 wandb_孤鹏独翔,鸿飞九霄的博客-程序员秘密

概述YOLOv5(v4.0 release开始)已经在本地集成了Weights &amp; Biases,也就是可视化的工具wandb,可方便的追踪模型训练的整个过程,包括模型的性能、超参数、GPU的使用情况、模型预测,还有数据集。软硬件环境OS:CentOS 7.7.1908 [[email protected] yolov5-docker-image]$ cat /etc/redhat-releaseCentOS Linux release 7.7.1908 (Core)[[email protected] y

【excel】用按钮跳转到表格的定义位置_excel跳转到引用位置_懒懒的狗头的博客-程序员秘密

2020-01-15【实现后的效果】首先,先展示效果,然后说明实现方案:在表格的其他任何位置点击如图所示的『121 电气零件』按钮,就会一下跳转到事先定义好的单元格,方便在数据众多的表格数据中进行定位。【实现方案】第一步,点击【插入】》【形状】,在表里随便拉个方框,输入按钮名称;第二步,点击【公式】》【名称管理器】,然后点击『新建』,按图所示设置公式名称和引用位置,点击『确定』;...

未来想向人工智能等方面发展,学编程的话是python还是java合适呢?_一抹斜阳尽余辉的博客-程序员秘密

看了你提的问题,就是想向人工智能领域发展,而不知道,编程语言是学Python好还,学Java好,我给你截一张的我博客的评论,如下这是一名java工程师的回答,我想这应该是很有说服务力的吧,如果在前3年,Matlab、Scala、R、Java和Python,还有的一争,但是现在,Python作为AI时代的头牌语言已经确定。时至今日,Python已经是数据分析和AI的第一语言,网络攻防的第...

随便推点

我,看房没戴头盔,损失二十万_程序员大咖的博客-程序员秘密

Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲金磊 鱼羊 发自 凹非寺 量子位 报道 | 公众号 ...

Vue中侦听器watch时,调用this时出现undefined问题_vue watch this报错_犹有傲霜枝的博客-程序员秘密

watch侦听器中,我们要将新的值赋给this.a出错watch: { value: (newV, oldV) =&amp;amp;amp;gt; { this.a = newV; }}这里报错undefined,这里错误的原因是不能写成箭头函数。写成箭头函数后,this会取上下文,而不是组件里面的this了,正确写法为:watch: { value: function(newV, oldV) { t...

Linux下应用程序开发:QT的内部进程通信_qt 与linux程序通信_fjiale的博客-程序员秘密

<br />Linux下应用程序开发:QT的内部进程通信<br />http://www.lupaworld.com/tutorial-view-aid-7177.html<br /> <br />Qt 作为一种跨平台的基于 C++ 的 GUI 系统,能够提供给用户构造图形用户界面的强大功能。自从 1996 年 Qt 被 Trolltech 公司发布以来,该系统成为世界上很多成功的图形用户应用所使用的主要系统。更为重要的是,Linux 操作系统的桌面环境系统 KDE 也是基于 Qt 构造的。目前,Qt 已经

lvs,haproxy,keepalived,heartbeat_weixin_34050389的博客-程序员秘密

lvs的是通过vrrp协议进行数据包转发的,提供的是4层的负载均衡。特点是效率高,只要你机器网卡抗的住就不是问题。 haproxy可以提供4层或7层的数据转发服务,能做到7层的好处是可以根据服务所处的状态等进行负载。 以上两者只是实现了负载均衡,但是他们本身是明显的单点故障,因此需要使用双机软件做热备,来保证高可用性。keepalived可以通过检测vrrp数据包来切换,...

git使用教程 + github国内镜像 + TortoiseGit配置及修复_git国内镜像_rainbow_lucky0106的博客-程序员秘密

https://github.com.cnpmjs.org/备用https://www.gitclone.com/gogs/https://gitclone.com/https://gitee.com/

go-zero 单体应用框架学习—2 中间件的添加和原理_gozero casbin_wanmei002的博客-程序员秘密

中间件的添加在 server.Server 结构体有个一方法 Use // Use adds the given middleware in the Server. func (e *Server) Use(middleware Middleware) { e.ngin.use(middleware) } type Middleware func(next http.HandlerFunc) http.HandlerFunc

推荐文章

热门文章

相关标签