geom_tile找到合适的瓷砖高度

时间:2016-10-17 15:39:52

标签: r ggplot2 height heatmap

我正在使用

绘制热图
ggplot(param, aes(V2,  V1,z=V7))+ geom_tile(aes(fill = V7, height=0.02))

但是我的V1不是等间隔的。我怎样才能找到合适的高度?因为某些小值,高度= 0.02可能太大,所以它们被其他值覆盖。

你能举个例子说明怎么做吗?例如。 V1值如下:

1,0.8,0.7,0.45,0.3,0.12,0.07,0.0004

所以我需要找到每对值的差异。但最小高度与最大高度不同。我读到瓷砖从高度h的-h / 2到h / 2。但最小高度当然是不同的,以避免差距!

3 个答案:

答案 0 :(得分:0)

答案(严重)取决于您要表示的内容。如果存在某些固有高度(例如,应该应用该值的范围),则应使用该高度。也就是说,如果每个度量都是一个小区域的点测量,那就是应该使用的区域。

但是,如果您要做的只是让条形图相互接触,那么就可以完成,但必须在调用ggplot之外完成。 (另请注意:图表的解释可能略有不同,因为较大的差距将意味着某些指标覆盖的范围比其他指标更广,而且这些指标不会以真实位置为中心。)

使用dplyr,您只需计算两次测量之间的中点,并将其用作点之间的边界。然后,使用geom_rect代替geom_tile直接传递这些边界。请注意,由于您未发布任何数据,因此假定您的值范围有些:

sampleData <-
  data.frame(
    x = c(1,2,3)
    , y = c(0.01, 0.1, 1)
    , z = c(1,2,3)
  )


sampleData %>%
  mutate(ymin = (y + lag(y, default = 0))/2
         , ymax = (y + lead(y, default = 1.5))/2
         , xmin = x - 0.5
         , xmax = x + 0.5
         ) %>%
  ggplot(aes(xmin = xmin
             , xmax = xmax
             , ymin = ymin
             , ymax = ymax
             , fill = z)) +
  geom_rect()

enter image description here

以下是使用多个x位置的示例。请注意,在这里,我没有取平均值来获取yminymax,而是明确地将它们设置为我想要的边缘:

sampleData <-
  data.frame(
    x = rep(c(1,2,3), each = 3)
    , y = c(0.01, 0.1, 1
            , 0.04, 0.3, 0.9
            , 0.2, 0.5, 0.8)
    , z = c(1,2,3)
  )


sampleData %>%
  group_by(x) %>%
  arrange(y) %>%
  mutate(ymin = (y + lag(y))/2
         , ymax = (y + lead(y))/2
         , xmin = x - 0.5
         , xmax = x + 0.5
         , ymin = ifelse(is.na(ymin), 0, ymin)
         , ymax = ifelse(is.na(ymax), 1.25, ymax)
  ) %>%
  ggplot(aes(xmin = xmin
             , xmax = xmax
             , ymin = ymin
             , ymax = ymax
             , fill = z)) +
  geom_rect()

enter image description here

答案 1 :(得分:0)

谢谢!有效!但是,我不需要滞后的默认值= 0并且在你的上一个例子中领先,因为我得到了NA?

是不是像y值这样的不相等的x值?

答案 2 :(得分:0)

根据我的数据结构:

数据是列式的,每y都有x值:

y x z 1 0.1# 1 0.2# 1 0.3# 1 0.4# 3 0.1 3 0.2 3 0.3 3 0.4

等等,例如