楼主: tmdxyz
4912 37

[有偿编程] 1000论坛币求作一个图 [推广有奖]

  • 9关注
  • 93粉丝

院士

74%

还不是VIP/贵宾

-

威望
1
论坛币
168391 个
通用积分
128.0114
学术水平
256 点
热心指数
329 点
信用等级
224 点
经验
13501 点
帖子
4678
精华
0
在线时间
3649 小时
注册时间
2008-1-10
最后登录
2024-4-20

1000论坛币
前段时间看到“柳叶刀”杂志上有一篇文章(原文献见附件),其中的一个图(Figure 3)很有意思。感觉是用ggplot做的(stack column + 极坐标)。

为此我假设了一套数据(见附件),试图仿做一下(见附图)。

只可惜
(1)画不出最外头那一圈代表疾病的分类,“A,B,C...”
(2)中间那个空白的圆圈怎么画
(3)那一圈缺刻,里头的年份,不知怎么画进去
(4)那些疾病种类的文本,字号能不能缩小一些,且旋转一定的角度?因为若不然,下方有些就会显示不全。

(5)整个图形的颜色填充,能不能设定为浅色?我附图太暗了

本人初学R,实在不会,故此悬赏1000个论坛币。请您把根据您的代码所画出来的图贴上,我若觉得确实可行,就将购买您设为1000论坛币的代码。


2.jpeg (311.94 KB)

2.jpeg

1.png (141.21 KB)

1.png

data.rar

634.05 KB

本附件包括:

  • data.xlsx

paper.pdf

715.89 KB

最佳答案

cheetahfly 查看完整内容

水平所限,逐渐试错拼凑出的来的。 首先,数据放在变量a中,数据变形的过程就不啰嗦了,最终变成了tidy data,共四个变量:“type”,“name”,“year”,“value”,其中前两个是factor,“year”是integer。 最后的效果如下: 另外,对于避免字重合的问题,我首先尝试着旋转45度,发现必然会有某个位置上的字存在着重合的风险,而且影响阅读体验,因此,我的建议是将比较短的标签放在正底部附近,人为调整一下顺序,就可 ...
关键词:1000论坛币 0论坛币 论坛币 1000个论坛币 Figure 柳叶刀 极坐标 文章 杂志 种类

回帖推荐

zerofung 发表于31楼  查看完整内容

晕他自动给我换了个逗号,你换成英文的逗号,或者运行上面这个。
沙发
cheetahfly 在职认证  发表于 2017-5-22 10:20:29 |只看作者 |坛友微信交流群
水平所限,逐渐试错拼凑出的来的。
首先,数据放在变量a中,数据变形的过程就不啰嗦了,最终变成了tidy data,共四个变量:“type”,“name”,“year”,“value”,其中前两个是factor,“year”是integer。
  1. library(tidyverse)
  2. verticalSegment <- data_frame(x = seq(0.5, 45.5, 1),  y = 0.5, xend = seq(0.5, 45.5, 1), yend = 10.5)
  3. horizonSegment <- data_frame(x = 0.5, y = seq(0.5, 10.5, 1), xend = 45.5, yend = seq(0.5, 10.5, 1))
  4. classSegment <- data_frame(x = c(0.6, 4.6, 14.6, 34.6), xend = c(4.4, 14.4, 34.4, 45.4), y = 11.5, yend = 11.5)
  5. classTail <- data_frame(x = c(0.6, 4.4, 4.6, 14.4, 14.6, 34.4, 34.6, 45.4),
  6.                         xend = c(0.6, 4.4, 4.6, 14.4, 14.6, 34.4, 34.6, 45.4),
  7.                         y = 11.5, yend = 11)
  8. Xtext <- a %>%
  9.     filter(year == 2004) %>%
  10.     .$name %>%
  11.     as.character()
  12. a %>%
  13.     ggplot(aes(x = name, y = factor(year))) +
  14.     geom_tile(aes(fill = value)) +
  15.     geom_segment(data = horizonSegment, aes(x = x, y = y, xend = xend, yend = yend)) +
  16.     geom_segment(data = verticalSegment, aes(x = x, y = y, xend = xend, yend = yend)) +
  17.     geom_segment(data = classSegment , aes(x = x, y = y, xend = xend, yend = yend)) +
  18.     geom_segment(data = classTail, aes(x = x, y = y, xend = xend, yend = yend)) +
  19.     scale_fill_continuous(low = "#FFFFFF", high = "#D2691E") +
  20.     scale_y_discrete(expand = c(0, 2)) +
  21.     scale_x_discrete(expand = c(0, 1.5)) +
  22.     theme(legend.position = c(0, 1),
  23.           legend.justification = c(-1, 1.5),
  24.           plot.background = element_blank(),
  25.           panel.grid.major = element_blank(),
  26.           panel.grid.minor = element_blank(),
  27.           panel.border = element_blank(),
  28.           panel.background = element_blank(),
  29.           axis.title.y = element_blank(),
  30.           axis.text.y = element_blank(),
  31.           axis.title.x = element_blank(),
  32.           axis.text.x = element_blank(),
  33.           axis.ticks = element_blank()) +
  34.     annotate("text", x = 46, y = 1:10, label =  2004:2013) +
  35.     annotate("text", x = c(2.5, 9.5, 24.5, 40), y = 11, label = c("A", "B", "C", "D")) +
  36.     annotate("text", x = 1:45, y = 12, label = Xtext) +
  37.     coord_polar(start = pi/360*15.5)
复制代码
最后的效果如下:
PolarHeatMap.png

另外,对于避免字重合的问题,我首先尝试着旋转45度,发现必然会有某个位置上的字存在着重合的风险,而且影响阅读体验,因此,我的建议是将比较短的标签放在正底部附近,人为调整一下顺序,就可以解决该问题了。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
梦孟小宝 + 5 + 1 + 1 + 1 厉害了版主
admin_kefu + 50 + 30 + 2 热心帮助其他会员

总评分: 经验 + 50  论坛币 + 35  学术水平 + 1  热心指数 + 3  信用等级 + 1   查看全部评分

使用道具

藤椅
zerofung 学生认证  发表于 2017-5-22 16:18:21 |只看作者 |坛友微信交流群
  1. library(tidyverse)
  2. df <- read_csv("data.csv") %>% select(1:12)
  3. df <- rbind(c("e", "e1", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), df) %>% as.data.frame()
  4. a <- df %>% gather(key = "Year", value = "Val", - c(Type, Name))
  5. a$Val <- as.numeric(a$Val)
  6. a$Year <- as.numeric(a$Year)
  7. ggplot(a) + geom_tile(aes(x = Name, y = Year, fill = Val)) +
  8. ylim(c(2000, 2014)) + annotate("text", x = "e1", y = 2004:2013, label = as.character(2004:2013)) + labs(x = NULL, y = NULL) +
  9. coord_polar(theta = "x") + geom_hline(yintercept = 2014) + scale_fill_gradient(high = "#F77400", low = "yellow", na.value = "white") +
  10. theme_classic() + theme(axis.line = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank())
复制代码

TIM截图20170522161819.png (48.84 KB)

TIM截图20170522161819.png

已有 1 人评分论坛币 收起 理由
admin_kefu + 30 热心帮助其他会员

总评分: 论坛币 + 30   查看全部评分

使用道具

板凳
zerofung 学生认证  发表于 2017-5-22 16:32:57 |只看作者 |坛友微信交流群
代码里的美元符号显示不好。。。。有些细节其实还是用PS擦掉或添加,比花心思去写代码更划算,做事毕竟要考虑时间投入产出比的。针对你的问题回答一下
1.外圈分类,PS吧也只是几个字了。
2.空白圈和缺刻是通过人为增加不要的值来实现的,像上面代码那样。
3.字体大小角度当然可以改,在theme里可以慢慢调,但是由于你给的数据只有那么短,也不知道具体怎么才合适你的,所以就提供个思路。(另外你说的重叠问题,注意ggplot作图导出的时候图片大小直接影响字体的重叠,所以你要自己再试试)
4.颜色填充在scale_fill_gradient这个函数里自己改,取色我是随意的,教你个好方法,打开QQ,用Ctrl+Alt+A开启截图模式,移动到你想要的颜色地方,小框就会显示那里的RGB值,再按住ctrl,可以看“#F77400”这种值,可以直接应用到代码里

使用道具

报纸
tmdxyz 发表于 2017-5-22 16:57:12 |只看作者 |坛友微信交流群
zerofung 发表于 2017-5-22 16:18
谢谢!但是还有一点小问题:
(1)那一圈代表疾病的分类,“A,B,C...”,怎么添加?
(2)代表年份的那个缺刻,角度好像有些歪呀?
(3)我在执行代码到前面几行,就出现了错误提示(见下面截图),不知为何?
(4)代码中有一些“%>%”是什么意思?

我把数据整理了一下,您再帮忙看看,好吗?

www.jpg (70.55 KB)

www.jpg

ccc.rar

3.45 KB

本附件包括:

  • ccc.csv

使用道具

地板
zerofung 学生认证  发表于 2017-5-22 17:55:08 |只看作者 |坛友微信交流群
tmdxyz 发表于 2017-5-22 16:57
谢谢!但是还有一点小问题:
(1)那一圈代表疾病的分类,“A,B,C...”,怎么添加?
(2)代表年份的那 ...
1,ABC用PS加比研究出代码怎么加更快;2,年份角度你可以仔细看看你给的lancet图也是歪的,他把空白放在第一,即十二点方向的右边,我放在最后,即十二点的左边,仅此而已;3,是我说的这个论坛美元符号显示问题,你把a和Val,a和Year中间加个美元符号就好。另外你的数据我改过列名,类型我用的英语Type,名称我用的Name,尽量避免在R里用中文。4,%>%是dplyr里面的管道操作符,有空可以研究一下dplyr,对R的学习很有帮助

使用道具

7
tmdxyz 发表于 2017-5-23 08:26:27 |只看作者 |坛友微信交流群
cheetahfly 发表于 2017-5-23 00:20
水平所限,逐渐试错拼凑出的来的。
首先,数据放在变量a中,数据变形的过程就不啰嗦了,最终变成了tidy da ...
非常感谢您。现在您这个图形几乎完美。但是我还有两个小小的问题:
(1)那个空白的放年份字符的缺刻,稍微有些宽,请问在哪个地方调节?请原谅我有一点强迫症
(2)您这个code太复杂了,我实在是蒙圈了。不过,这不是您的问题,是因为我太小白了
(3)您做这个图所依据的数据文件是哪一个?
(4)待我重复一下您的代码,再把您的设为精彩回复哈。请稍等

使用道具

8
tmdxyz 发表于 2017-5-23 08:57:33 |只看作者 |坛友微信交流群
在美元符号之前的那一个语句
a <- df %>% gather(key = "Year", value = "Val", - c(Type, Name))
就出现了这个错误提示
Error in eval(expr, envir, enclos) : object 'Type' not found

使用道具

9
tmdxyz 发表于 2017-5-23 09:01:47 |只看作者 |坛友微信交流群
唉,回复您的问题,还需要其他一些麻烦的手续?
您现在画的这个图,几乎完美。但是:
(1)那个空白的缺刻,其宽度怎么调节,语句在什么地方呀?
(2)总的来说,您这个code实在是让我蒙圈。我原以为ggplot+coord_polar就可以了呢
(3)您作这个图,用的是哪一个数据呢?

使用道具

10
cheetahfly 在职认证  发表于 2017-5-23 09:48:39 |只看作者 |坛友微信交流群
*****xyz 发表于 2017-5-23 09:01
唉,回复您的问题,还需要其他一些麻烦的手续?
您现在画的这个图,几乎完美。但是:
(1)那个空白的缺刻 ...
我不知道你是问的我还是楼上那位,我从自己的角度回答一下:
我的数据是你最开始的数据;
调节圆圈的缺口宽度和相对角位置,主要靠两个函数:
scale_x_discrete(expand = c(0, 1.5)) # 留出缺口
coord_polar(start = pi/360*15.5) # 保持一边竖直
这个图为什么代码这么多,因为它不是统计研究中的标准统计图表,而是将结果展示的商业个性图表,是需要花时间来细细调整,以达到自己想要的效果。

使用道具

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

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

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

GMT+8, 2024-4-20 22:47