gpt4 book ai didi

r - 在 geom_tile()/geom_raster() 中标记特定的瓦片

转载 作者:行者123 更新时间:2023-12-04 01:44:55 25 4
gpt4 key购买 nike

假设我有一个像这样的 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()对于条纹,我将如何指定 yendxend ?

  • 任何帮助表示赞赏。

    编辑 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 中,我使用了 ifelsescale_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

    关于r - 在 geom_tile()/geom_raster() 中标记特定的瓦片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258454/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com