#r #ggplot2 #height #heatmap
#r #ggplot2 #высота #тепловая карта
Вопрос:
Я строю тепловую карту с
ggplot(param, aes(V2, V1,z=V7)) geom_tile(aes(fill = V7, height=0.02))
Но мой V1 не равномерно распределен. Как я могу найти правильную высоту? Потому что height = 0.02 может быть слишком большим для некоторого небольшого значения, так что они покрываются другими.
Можете ли вы привести мне пример, как это сделать? Например, значение V1 имеет вид:
1, 0.8,0.7,0.45,0.3, 0.12,0.07,0.0004
Итак, мне нужно найти различия каждой пары значений. Но минимальная высота отличается от максимальной высоты. Я читал, что плитка переходит от -h / 2 к h / 2 для высоты h. Но минимальная высота, конечно, отличается, чтобы избежать пробелов!
Ответ №1:
Ответ зависит (в значительной степени) от того, что вы пытаетесь представить. Если есть некоторая внутренняя высота (например, диапазон, в котором должно применяться значение), вы должны использовать это. То есть, если каждая мера является точечной мерой на небольшой площади, это та область, которая должна использоваться.
Если, однако, все, что вы хотите сделать, это заставить полосы касаться друг друга, это можно сделать, но это нужно будет делать вне вызова to 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. Я вижу прямо сейчас, что это создает проблемы, если у вас несколько одинаковых значений y?
2.
default = 0
Не требуется (и не рекомендуется), потому что вы явно устанавливаете NA на значимое значение (внешний диапазон). Вы, конечно, могли бы сделать то же самое для оси x, хотя я не могу представить себе способ сделать и то, и другое одновременно и получить что-нибудь значимое для построения графика. Значения y обрабатываются отдельно для каждого местоположения x. Если у вас одинаковые точки y в одной точке оси x, это неправильный график, который нужно создавать в любом случае.3. Спасибо. Мой фрейм данных структурирован таким образом, что для каждого значения x существует одно и то же значение y:
4. так что для каждой группы y существуют значения x. Потому что на графике функции для линии горизонта также есть «много» значений x для одного значения y, так сказать …;-)
Ответ №2:
Спасибо! Это сработало! Но разве мне не нужно значение по умолчанию = 0 для задержки и опережения в вашем последнем примере, потому что я получаю NAs?
И является ли это аналогом неравнозначных значений sopaced x, как для значений y?
Ответ №3:
В соответствии со структурой моих данных:
данные обрабатываются по столбцам, и для каждого 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
и т. д., например