Тепловая карта ggplot не может заполнить плитки

Этот (минимальный, автономный) пример не работает:

require(ggplot2) 

min_input = c(1, 1, 1, 2, 2, 2, 4, 4, 4)
input_range = c(4, 470, 1003, 4, 470, 1003, 4, 470, 1003)
density = c(
    1.875000e-01,
    5.598958e-04,
    0.000000e+00,
    1.250000e-02,
    3.841146e-04,
    0.000000e+00,
    1.250000e-02,
    1.855469e-04,
    0.000000e+00)       

df = data.frame(min_input, input_range, density)

pdf(file='problemspace.pdf')
ggplot(df, aes(x=min_input, y=input_range, fill=density)) +
    geom_tile()
dev.off()

Производство:

плитки с зазорами

Почему большие пробелы?


person Reinderien    schedule 12.05.2015    source источник
comment
Может быть, x&y не являются факторами? Попробуйте ggplot(densities, aes(x=factor(min_input), y=factor(input_range), fill=density)) + geom_tile()   -  person ddiez    schedule 12.05.2015
comment
@ddiez Это заменяет одну проблему другой. Зазоров нет, но масштабирование потеряно. Концептуально это должны быть непрерывные переменные, а не факторы.   -  person Reinderien    schedule 12.05.2015
comment
Я понимаю. Вам нужны неравные размеры плиток, как в примерах внизу страницы справки для geom_tile. , Правильно?   -  person ddiez    schedule 12.05.2015
comment
@ddiez Неравные размеры плитки, конечно, или интерполированные маленькие плитки. Но я не уверен, что подход внизу geom_tile сработает.   -  person Reinderien    schedule 12.05.2015


Ответы (1)


Есть пробелы, потому что у вас нет данных для всех плиток. Если вы хотите попытаться заполнить их, ваш единственный вариант — интерполировать (при условии, что у вас нет доступа к дополнительным данным). Теоретически geom_raster() (близкий родственник geom_tile()) поддерживает интерполяцию. Однако, согласно этой проблеме github, эта функция в настоящее время не работает.

Однако в качестве обходного пути вы можете использовать qplot, который является просто оберткой над ggplot:

qplot(min_input, input_range, data=df, geom="raster", fill=density, interpolate=TRUE)

Если между точками, для которых у вас есть данные, слишком много места, вы все равно получите пустые места на графике, но это расширит диапазон, для которого вы можете оценить значения.

РЕДАКТИРОВАТЬ:

На основе примера, который вы разместили, это будет вывод

введите здесь описание изображения

Как видите, через середину проходит вертикальная белая полоса из-за отсутствия точек данных между 2 и 4.

person seaotternerd    schedule 12.05.2015
comment
Как определить слишком много места? - person Reinderien; 12.05.2015
comment
Основываясь на примере, похоже, что все, что не имеет точки данных в пределах 0,5 x единиц, слишком далеко. Это побочный продукт используемого точного алгоритма интерполяции, который я не знаю навскидку. - person seaotternerd; 12.05.2015
comment
Да, хорошо, после дальнейшего изучения, geom_raster() специально разбивает область на плитки одинакового размера. Плитки окрашиваются на основе точек данных, которые попадают в них, а цвет между плитками линейно интерполируется (поэтому берется взвешенное по расстоянию цветовое среднее). Плитки без данных белые. - person seaotternerd; 12.05.2015
comment
ХОРОШО. То есть я должен сам делать интерполяцию? - person Reinderien; 12.05.2015
comment
Если вы хотите, чтобы он проходил через большие расстояния, то ответ будет положительным, поскольку нет возможности указать альтернативную функцию интерполяции. - person seaotternerd; 12.05.2015