楼主: cheetahfly
1982 4

[程序分享] 用ggplot2“l临摹”一张商业图表 [推广有奖]

  • 2关注
  • 71粉丝

版主

院士

5%

还不是VIP/贵宾

-

威望
0
论坛币
58757 个
通用积分
1374.5409
学术水平
480 点
热心指数
587 点
信用等级
328 点
经验
126270 点
帖子
2061
精华
1
在线时间
3765 小时
注册时间
2010-10-27
最后登录
2024-4-19

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
最近看到一张商业图片,觉得不错:
图片范例2.jpg
于是尝试用ggplot2包“临摹”了一张,下面是代码(画出就成,没有优化过)
  1. # 环境设置
  2. library(tidyverse)
  3. windowsFonts(myCFont = windowsFont("微软雅黑"))
  4. windowsFonts(myNFont = windowsFont("Miriam"))

  5. # 数据和参数
  6. width <- 0.42

  7. df <- data_frame(source = c("遗弃", "送养", "其他"),
  8.                  boy = c(476, 3848, 17585 - 476 - 3848),
  9.                  girl = c(1900, 9512, 18265 - 1900 - 9512))

  10. df <- df %>%
  11.   mutate(boy_cum = cumsum(boy),
  12.          girl_cum  = cumsum(girl))

  13. df_p <- data_frame(x = c(1 + width, rep(2 - width, 2), 1 + width),
  14.                    y1 = c(0, 0, 1900, 476),
  15.                    y2 = c(476, 1900, 11412, 4324),
  16.                    y3 = c(4324, 11412, 18265, 17585))

  17. df_t <- data_frame(x1 = 1 - width,
  18.                    y1 = c(476, 4324),
  19.                    l1 = c("476", "3,848"),
  20.                    x2 = 2 - width,
  21.                    y2 = c(1900, 11412),
  22.                    l2 = c("1,900", "9,512"))

  23. # 画图
  24. df %>%
  25.   select(source, boy, girl) %>%
  26.   gather(type, value, -1) %>%
  27.   mutate(type = as.integer(factor(type))) %>%
  28.   ggplot(aes(x = type, y = value, fill = source)) +
  29.   geom_bar(position = "stack", stat = "identity",
  30.            show.legend = FALSE,
  31.            width = 2 * width) +
  32.   theme_void() +
  33.   ylim(0, 20200) +
  34.   xlim(-0.1, 2.5) +
  35.   scale_fill_manual(values = c("#adc1da", "#6d8cbb", "#486390")) +
  36.   geom_polygon(data = df_p, aes(x = x, y = y1), fill = "#bec9db") +
  37.   geom_polygon(data = df_p, aes(x = x, y = y2), fill = "#cdd9e9") +
  38.   geom_polygon(data = df_p, aes(x = x, y = y3), fill = "#e6edf5") +
  39.   annotate(geom = "text", x = df_t$x1, y = df_t$y1, label = df_t$l1,
  40.            color = "white", size = 6, hjust = -0.1, vjust = 1.2,
  41.            family = "myNFont") +
  42.   annotate(geom = "text", x = df_t$x2, y = df_t$y2, label = df_t$l2,
  43.            color = "white", size = 6, hjust = -0.1, vjust = 1.,
  44.            family = "myNFont") +
  45.   annotate(geom = "text", x = 1:2 - width, y = c(17585, 18265),
  46.            label = c("17,585", "18,265"), size = 6, hjust = 0, vjust = -0.8) +
  47.   annotate(geom = "text", x = c(1, 1, 2) - width, y = c(18265, rep(18265 + 1000, 2)),
  48.            label = c("所有情况", "男孩", "女孩"), size = 6, hjust = 0,
  49.            vjust = -1.2, family = "myCFont") +
  50.   geom_segment(x = 1 - width, xend = 0.95, y = 19450, yend = 19450, color = "gray50", size = 1) +
  51.   geom_segment(x = 2 - width, xend = 1.86, y = 19450, yend = 19450, color = "gray50", size = 1) +
  52.   geom_segment(x = 0.35, xend = 0.50, y = 476, yend = 476, size = 1, color = "gray50") +
  53.   geom_segment(x = 0.35, xend = 0.50, y = 4324, yend = 4324, size = 1, color = "gray50") +
  54.   annotate(geom = "text", x = 0.35, y = c(476, 4324), label = c("遗弃", "送养"),
  55.            vjust = 1.5, hjust = 0, size = 5, family = "myCFont") +
  56.   annotate(geom = "text", x = 0.45, y = 19265 - 0:6 * 1100,
  57.            label = c("是", "家", "人", "主", "动", "放", "弃"),
  58.            hjust = 1, vjust = -0.2, family = "myCFont", size = 11, color = "#486390") +
  59.   annotate(geom = "text", x = 0.20, y = 19265 - 0:6 * 1100,
  60.            label = c("相", "当", "多", "儿", "童", "失", "踪"),
  61.            hjust = 1, vjust = -0.2, family = "myCFont", size = 11, color = "#6d8cbb") +
  62.   geom_segment(x = 0.03, xend = 0.45, y = 12300, yend = 12300, color = "gray50", size = 1) +
  63.   annotate(geom = "text", x = 0.05, y = 12100 - 0:13 * 400,
  64.            label = c("注", ":", "这", "里", "的", "送", "养", "、", "遗", "弃", "仅", "为", "家", "人"),
  65.            vjust = 1.5, hjust = 0, size = 4, family = "myCFont", color = "gray50") +
  66.   annotate(geom = "text", x = 0.14, y = 12100 - 0:15 * 400,
  67.            label = c("后", "来", "想", "念", "孩", "子", "主", "动", "寻", "找", ",", "非", "完", "整", "情", "况"),
  68.            vjust = 1.5, hjust = 0, size = 4, family = "myCFont", color = "gray50") +
  69.   annotate(geom = "text", x = 0.34, y = 12100 - 0:8 * 400,
  70.            label = c("数", "据", "来", "源", ":", "宝", "贝", "回", "家"),
  71.            vjust = 1.5, hjust = 1, size = 4, family = "myCFont", color = "gray50") +
  72.   annotate(geom = "text", x = 0.45, y = 12100 - 0:3 * 400, label = c("单", "位", ":", "人"),
  73.            vjust = 1.5, hjust = 1, size = 4, family = "myCFont", color = "gray50") +
  74.   theme(text = element_text(face = "bold"))
复制代码
做出来的图如下:
ggplot制图.png
【该图仅做学习用途,勿做他用】

过程中有几点感悟:
1、商业图表专业的地方在于构图和色彩,构图我是照抄的,色彩我是抓取原图的色彩,所以我“临摹”的技术含量不高;
2、对于商业展示图表,个人感觉用ggplot2和base R的画图差别没有那么大了,都要用“绣花”功夫,逐个添加元素;
3、ggplot2最有优势的地方应该在数据探索和分析者与数据的互动上;
4、字体很重要,可惜我没有足够的字体库。




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:ggplot2 gplot plot GPL annotate

已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
llb_321 + 5 精彩帖子
fin-qq + 60 + 3 + 3 精彩帖子
dxystata + 100 + 20 + 1 + 1 + 1 鼓励积极发帖讨论
narcissism0923 + 5 精彩帖子

总评分: 经验 + 160  论坛币 + 25  学术水平 + 9  热心指数 + 4  信用等级 + 1   查看全部评分

沙发
20115326 学生认证  发表于 2018-9-13 09:09:00 |只看作者 |坛友微信交流群
厉害

使用道具

藤椅
hifinecon 发表于 2018-9-13 10:04:44 |只看作者 |坛友微信交流群
very good, If I were you, it will take me a long time to replicate the graph. Thanks for sharing!

使用道具

板凳
zerofung 学生认证  发表于 2018-9-13 11:09:02 |只看作者 |坛友微信交流群
深表同意,ggplot2在迅速展探索数据,展现变量间的关系上表现出色,但是考虑到效率,商业图表上的各种美化(绣花功夫)还是用AI或者PS这些所见即所得的工具直观快捷

使用道具

报纸
fin-qq 发表于 2018-10-18 06:28:09 |只看作者 |坛友微信交流群

谢谢分享

论坛新推出区块链技术计算出的新通用积分,原注册会员可免费领取。还没领取的小伙伴们,赶快来领~您领了没?

https://bbs.pinggu.org/ext8_airdrop.php?airdropfrom^^uid=4568101
Mankind is great because of dreams.

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 08:14