Маркировка определенных плиток в geom_tile()/geom_raster()
Скажем, у меня есть data.frame вот так:
df <- matrix( rnorm(100), nrow = 10)
rownames(df) <- LETTERS[1:10]
molten <- melt(df)
molten$na <- FALSE
molten[ round(runif(10, 0, 100 )), "na" ] <- T
head(molten)
Var1 Var2 value na
1 A 1 -0.2413015 FALSE
2 B 1 1.5077282 FALSE
3 C 1 -1.0798806 TRUE
4 D 1 2.0723791 FALSE
Теперь я хочу построить фрагмент (или растровый) с использованием ggplot и отметить те плитки, которые имеют na=TRUE
. В настоящее время я рисую метки как точки:
g <- ggplot( molten ) +
geom_raster( aes( x = Var1, y = Var2, fill = value ) ) +
scale_fill_gradient2( low = "blue", high = "red", na.value="black", name = "" ) +
geom_point( aes( x = Var1, y = Var2, size= as.numeric(na) ) )
![tiles with points]()
Однако мне не очень нравится этот сюжет по двум причинам:
- По-прежнему сохраняется точка, даже если
molten$na = FALSE
. Конечно, я мог бы указать data=molten[ molten$na, ]
, но на самом деле это должно быть возможно без указания другого набора данных.
- Мне не нравятся очки, но хотелось бы, чтобы вокруг меня были рамки или полосы. Но я не знаю, как этого добиться. Если бы я использовал
geom_segment()
для полос, как бы я указал yend
и xend
?
Любая помощь приветствуется.
Изменить 1
Здесь dput
для воспроизводимости:
structure(list(Var1 = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L,
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("A",
"B", "C", "D", "E", "F", "G", "H", "I", "J"), class = "factor"),
Var2 = c(6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L,
9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L), value = c(-0.468920099229389,
0.996105987531978, -0.527496444770932, -0.767851702991822,
-0.36077954422072, -0.145335912847538, 0.114951323188032,
0.644232124274217, 0.971443502096584, 0.774515290180507,
-0.436252398260595, -0.111174676975868, 1.16095688943808,
0.44677656465583, -0.708779168274131, 0.460296447139761,
-0.475304748445917, -0.481548436194392, -1.66560630161765,
-2.06055347675196), na = c(FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, FALSE, TRUE, FALSE, FALSE, FALSE)), .Names = c("Var1",
"Var2", "value", "na"), row.names = c(51L, 52L, 53L, 54L, 61L,
62L, 63L, 64L, 71L, 72L, 73L, 74L, 81L, 82L, 83L, 84L, 91L, 92L,
93L, 94L), class = "data.frame")
Ответы
Ответ 1
Вот два возможных подхода:
В примере 1 я использовал ifelse
и scale_size_manual
для контроля того, наносится ли точка в каждой ячейке.
В примере 2 я создал небольшой вспомогательный data.frame и использовал geom_rect
для построения прямоугольника вместо точки. Для удобства я преобразовал Var2 в коэффициент. В ggplot2 каждый шаг по дискретной/факторной оси равен 1.0. Это позволяет легко вычислять значения для geom_rect
.
# Using ggplot2 version 0.9.2.1
library(ggplot2)
# Test dataset from original post has been assigned to 'molten'.
molten$Var2 = factor(molten$Var2)
# Example 1.
p1 = ggplot(data=molten, aes(x=Var1, y=Var2, fill=value)) +
geom_raster() +
scale_fill_gradient2(low="blue", high="red", na.value="black", name="") +
geom_point(aes(size=ifelse(na, "dot", "no_dot"))) +
scale_size_manual(values=c(dot=6, no_dot=NA), guide="none") +
labs(title="Example 1")
ggsave(plot=p1, filename="plot_1.png", height=3, width=3.5)
![enter image description here]()
# Example 2.
# Create auxiliary data.frame.
frames = molten[molten$na, c("Var1", "Var2")]
frames$Var1 = as.integer(frames$Var1)
frames$Var2 = as.integer(frames$Var2)
p2 = ggplot(data=molten) +
geom_raster(aes(x=Var1, y=Var2, fill=value)) +
scale_fill_gradient2(low="blue", high="red", na.value="black", name="") +
geom_rect(data=frames, size=1, fill=NA, colour="black",
aes(xmin=Var1 - 0.5, xmax=Var1 + 0.5, ymin=Var2 - 0.5, ymax=Var2 + 0.5)) +
labs(title="Example 2")
ggsave(plot=p2, filename="plot_2.png", height=3, width=3.5)
![enter image description here]()
Ответ 2
Как показано в комментариях @joran, вы можете передать подмножество данных на определенный уровень.
Использование данных примера
g <- ggplot( molten ) +
geom_raster( aes( x = Var1, y = Var2, fill = value ) ) +
scale_fill_gradient2( low = "blue", high = "red", na.value="black", name = "" ) +
geom_point(data = molten[molten$na,], aes( x = Var1, y = Var2, size= as.numeric(na) ) )
g
![enter image description here]()
Если вы хотите, чтобы легенда говорила что-то о том, что означают точки
g <- ggplot( molten ) +
geom_raster( aes( x = Var1, y = Var2, fill = value ) ) +
scale_fill_gradient2( low = "blue", high = "red", na.value="black", name = "" ) +
geom_point(data = molten[molten$na,], aes( x = Var1, y = Var2, colour = 'black' )) +
scale_colour_manual(name = 'Ooh look', values = 'black', labels = 'Something cool')
![enter image description here]()