我正在尝试使用ggplot2生成热图。我找到this example,我基本上试图用我的数据复制,但我遇到了困难。我的数据是一个简单的.csv文件,如下所示:
people,apple,orange,peach
mike,1,0,6
sue,0,0,1
bill,3,3,1
ted,1,1,0
我想制作一个简单的热图,其中水果的名称在x轴上,而人在y轴上。该图应描绘正方形,其中每个正方形的颜色表示所消耗的水果数量。对应于mike:peach
的方格应该是最暗的。
以下是我用来尝试生成热图的代码:
data <- read.csv("/Users/bunsen/Desktop/fruit.txt", head=TRUE, sep=",")
fruit <- c(apple,orange,peach)
people <- data[,1]
(p <- ggplot(data, aes(fruit, people)) + geom_tile(aes(fill = rescale), colour = "white") + scale_fill_gradient(low = "white", high = "steelblue"))
当我绘制这些数据时,我得到x轴上的果实数和y轴上的人数。我也没有得到代表水果数量的颜色渐变。如何在x轴上获取水果的名称,并将人们吃掉的水果数量显示为热图? 我在R中获得的当前输出看起来像这样:
答案 0 :(得分:31)
老实说@ dr.bunsen - 上面的例子很难重现,你没有阅读教程的第一部分linked。这可能是你在寻找的东西:
library(reshape)
library(ggplot2)
library(scales)
data <- structure(list(people = structure(c(2L, 3L, 1L, 4L),
.Label = c("bill", "mike", "sue", "ted"),
class = "factor"),
apple = c(1L, 0L, 3L, 1L),
orange = c(0L, 0L, 3L, 1L),
peach = c(6L, 1L, 1L, 0L)),
.Names = c("people", "apple", "orange", "peach"),
class = "data.frame",
row.names = c(NA, -4L))
data.m <- melt(data)
data.m <- ddply(data.m, .(variable), transform, rescale = rescale(value))
p <- ggplot(data.m, aes(variable, people)) +
geom_tile(aes(fill = rescale), colour = "white")
p + scale_fill_gradient(low = "white", high = "steelblue")
答案 1 :(得分:1)
七(!)年后,正确格式化数据的最佳方法是使用tidyr
而不是reshape
使用gather
中的tidyr
,很容易重新格式化数据以获取预期的3列(y轴为person
,x轴为fruit
-axis和count
作为值):
library("dplyr")
library("tidyr")
hm <- readr::read_csv("people,apple,orange,peach
mike,1,0,6
sue,0,0,1
bill,3,3,1
ted,1,1,0")
hm <- hm %>%
gather(fruit, count, apple:peach)
#syntax: key column (to create), value column (to create), columns to gather (will become (key, value) pairs)
数据现在看起来像:
# A tibble: 12 x 3
people fruit count
<chr> <chr> <dbl>
1 mike apple 1
2 sue apple 0
3 bill apple 3
4 ted apple 1
5 mike orange 0
6 sue orange 0
7 bill orange 3
8 ted orange 1
9 mike peach 6
10 sue peach 1
11 bill peach 1
12 ted peach 0
完美!让我们绘图。使用ggplot2进行热图绘制的基本要素是geom_tile
,我们将向其提供美观的x
,y
和fill
。
library("ggplot2")
ggplot(hm, aes(x=x, y=y, fill=value)) + geom_tile()
还不错,但是我们可以做得更好。
theme_bw()
,它摆脱了灰色背景。 我还喜欢使用RColorBrewer
中的调色板(与direction = 1
一起使用以获得更高值的深色,否则为-1)。有很多可用的调色板:红色,蓝色,光谱,RdYlBu(红色-黄色-蓝色),RdBu(红色-蓝色)等。在下面,我使用“绿色”。运行RColorBrewer::display.brewer.all()
以查看调色板的外观。
如果要平铺方块,只需使用coord_equal()
。
我经常发现图例没有用,但这取决于您的特定用例。您可以使用fill
隐藏guides(fill=F)
图例。
您可以使用geom_text
(或geom_label
)将值打印在图块的顶部。它需要美学x
,y
和label
,但在我们的情况下,x
和y
是继承的。您还可以通过传递size=count
作为美感来更大地打印更高的值-在这种情况下,您还希望将size=F
传递给guides
以隐藏尺寸图例。
您可以通过将color
传递到geom_tile
来在图块周围绘制线条。
将它们放在一起:
ggplot(hm, aes(x=fruit, y=people, fill=count)) +
# tile with black contour
geom_tile(color="black") +
# B&W theme, no grey background
theme_bw() +
# square tiles
coord_equal() +
# Green color theme for `fill`
scale_fill_distiller(palette="Greens", direction=1) +
# printing values in black
geom_text(aes(label=count), color="black") +
# removing legend for `fill` since we're already printing values
guides(fill=F) +
# since there is no legend, adding a title
labs(title = "Count of fruits per person")
要删除任何内容,只需删除相应的行。