首先,数据放在变量a中,数据变形的过程就不啰嗦了,最终变成了tidy data,共四个变量:“type”,“name”,“year”,“value”,其中前两个是factor,“year”是integer。
- library(tidyverse)
- verticalSegment <- data_frame(x = seq(0.5, 45.5, 1), y = 0.5, xend = seq(0.5, 45.5, 1), yend = 10.5)
- horizonSegment <- data_frame(x = 0.5, y = seq(0.5, 10.5, 1), xend = 45.5, yend = seq(0.5, 10.5, 1))
- 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)
- classTail <- data_frame(x = c(0.6, 4.4, 4.6, 14.4, 14.6, 34.4, 34.6, 45.4),
- xend = c(0.6, 4.4, 4.6, 14.4, 14.6, 34.4, 34.6, 45.4),
- y = 11.5, yend = 11)
- Xtext <- a %>%
- filter(year == 2004) %>%
- .$name %>%
- as.character()
- a %>%
- ggplot(aes(x = name, y = factor(year))) +
- geom_tile(aes(fill = value)) +
- geom_segment(data = horizonSegment, aes(x = x, y = y, xend = xend, yend = yend)) +
- geom_segment(data = verticalSegment, aes(x = x, y = y, xend = xend, yend = yend)) +
- geom_segment(data = classSegment , aes(x = x, y = y, xend = xend, yend = yend)) +
- geom_segment(data = classTail, aes(x = x, y = y, xend = xend, yend = yend)) +
- scale_fill_continuous(low = "#FFFFFF", high = "#D2691E") +
- scale_y_discrete(expand = c(0, 2)) +
- scale_x_discrete(expand = c(0, 1.5)) +
- theme(legend.position = c(0, 1),
- legend.justification = c(-1, 1.5),
- plot.background = element_blank(),
- panel.grid.major = element_blank(),
- panel.grid.minor = element_blank(),
- panel.border = element_blank(),
- panel.background = element_blank(),
- axis.title.y = element_blank(),
- axis.text.y = element_blank(),
- axis.title.x = element_blank(),
- axis.text.x = element_blank(),
- axis.ticks = element_blank()) +
- annotate("text", x = 46, y = 1:10, label = 2004:2013) +
- annotate("text", x = c(2.5, 9.5, 24.5, 40), y = 11, label = c("A", "B", "C", "D")) +
- annotate("text", x = 1:45, y = 12, label = Xtext) +
- coord_polar(start = pi/360*15.5)
另外,对于避免字重合的问题,我首先尝试着旋转45度,发现必然会有某个位置上的字存在着重合的风险,而且影响阅读体验,因此,我的建议是将比较短的标签放在正底部附近,人为调整一下顺序,就可以解决该问题了。