我正在使用
绘制热图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。但最小高度当然是不同的,以避免差距!
答案 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()
以下是使用多个x
位置的示例。请注意,在这里,我没有取平均值来获取ymin
和ymax
,而是明确地将它们设置为我想要的边缘:
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()
答案 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
等等,例如