用ggplot2绘制热图

热图算是各种途中有点复杂的一类图,但是其实画起来并不难。本文中的代码参考了《R数据可视化手册》的13.6,并在此基础上加以改进。

1.数据准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
pres_rating <- data.frame(
rating = as.numeric(presidents),
year = as.numeric(floor(time(presidents))),
quarter = as.numeric(cycle(presidents))
)
pres_rating
rating year quarter
1 NA 1945 1
2 87 1945 2
3 82 1945 3
4 75 1945 4
5 63 1946 1
6 50 1946 2
7 43 1946 3
8 32 1946 4
9 35 1947 1
10 60 1947 2
11 54 1947 3
12 55 1947 4
13 36 1948 1
14 39 1948 2
15 NA 1948 3
16 NA 1948 4
17 69 1949 1
18 57 1949 2
19 57 1949 3
20 51 1949 4
21 45 1950 1
22 37 1950 2
23 46 1950 3
24 39 1950 4
25 36 1951 1
26 24 1951 2
27 32 1951 3
28 23 1951 4
29 25 1952 1
30 32 1952 2
31 NA 1952 3
32 32 1952 4
33 59 1953 1
34 74 1953 2
35 75 1953 3
36 60 1953 4
37 71 1954 1
38 61 1954 2
39 71 1954 3
40 57 1954 4
41 71 1955 1
42 68 1955 2
43 79 1955 3
44 73 1955 4
45 76 1956 1
46 71 1956 2
47 67 1956 3
48 75 1956 4
49 79 1957 1
50 62 1957 2
51 63 1957 3
52 57 1957 4
53 60 1958 1
54 49 1958 2
55 48 1958 3
56 52 1958 4
57 57 1959 1
58 62 1959 2
59 61 1959 3
60 66 1959 4
61 71 1960 1
62 62 1960 2
63 61 1960 3
64 57 1960 4
65 72 1961 1
66 83 1961 2
67 71 1961 3
68 78 1961 4
69 79 1962 1
70 71 1962 2
71 62 1962 3
72 74 1962 4
73 76 1963 1
74 64 1963 2
75 62 1963 3
76 57 1963 4
77 80 1964 1
78 73 1964 2
79 69 1964 3
80 69 1964 4
81 71 1965 1
82 64 1965 2
83 69 1965 3
84 62 1965 4
85 63 1966 1
86 46 1966 2
87 56 1966 3
88 44 1966 4
89 44 1967 1
90 52 1967 2
91 38 1967 3
92 46 1967 4
93 36 1968 1
94 49 1968 2
95 35 1968 3
96 44 1968 4
97 59 1969 1
98 65 1969 2
99 65 1969 3
100 56 1969 4
101 66 1970 1
102 53 1970 2
103 61 1970 3
104 52 1970 4
105 51 1971 1
106 48 1971 2
107 54 1971 3
108 49 1971 4
109 49 1972 1
110 61 1972 2
111 NA 1972 3
112 NA 1972 4
113 68 1973 1
114 44 1973 2
115 40 1973 3
116 27 1973 4
117 28 1974 1
118 25 1974 2
119 24 1974 3
120 24 1974 4

2.画图

1
2
3
4
5
6
7
8
9
library(ggplot2)
p <- ggplot(pres_rating, aes(x=year, y=quarter, fill=rating))+
theme(panel.background = element_blank(),axis.line = element_line(colour="black"))+
theme(axis.ticks.x = element_blank())+
theme(axis.ticks.y = element_blank())+
theme(axis.title.y=element_blank())+
theme(axis.title.x=element_blank())+
theme(legend.title=element_blank())
p+ geom_raster()

heatmap
其中

代码 作用
theme(panel.background = element_blank(),axis.line = element_line(colour=”black”)) 将ggplot的默认的灰色背景去掉,坐标轴线为黑色
theme(axis.ticks.x = element_blank()) 去掉X轴的轴须
theme(axis.title.y=element_blank()) 去掉y轴标题
theme(legend.title=element_blank()) 去掉图例的标题
geom_raster() 绘制热图,geom_raster()效率更高,也可用geom_tile() 参数更多

3.修改热图的颜色
ggplot2默认的热图颜色中,颜色由浅入深代表数字由高到低,这种颜色显示方式多少与我们的习惯相反。因此我们经常需要修改热图的颜色,例如我们想修改成这篇文献里的这幅图
heatmap2
的颜色。可以用取色器获取这些颜色的RGB号,然后就可以添加到图里:

1
2
3
4
5
6
7
8
9
p <- ggplot(pres_rating, aes(x=year, y=quarter, fill=rating))+
theme(panel.background = element_blank(),axis.line = element_line(colour="black"))+
theme(axis.ticks.x = element_blank())+
theme(axis.ticks.y = element_blank())+
theme(axis.title.y=element_blank())+
theme(axis.title.x=element_blank())+
theme(legend.title=element_blank())+
scale_fill_gradient2(low = "#5E4EA2", high = "#9E0041",mid="#FBFCB5",midpoint=60)
p+ geom_raster()

其中scale_fill_gradient2(low = "#5E4EA2", high = "#9E0041",mid="#FBFCB5",midpoint=60)的命令中

命令 作用
scale_fill_gradient2 三色渐变,由中间色、两端色渐变而成,此外还有scale_fill_gradient为两色渐变,scale_fill_gradientn为等间隔的n种颜色
low = “#5E4EA2”和high = “#9E0041” 根据取色器取到的两端的颜色
mid=”#FBFCB5” 中间的颜色
midpoint=60 设置中间点

得到的结果如下
heatmap3


参考

  1. https://ggplot2.tidyverse.org/reference/geom_tile.html
  2. 《R数据可视化手册》
------本文结束欢迎留言(你的邮箱将不会被显示)------