Создайте тепловую карту R без полей - PullRequest
2 голосов
/ 01 октября 2011

Я пытаюсь сделать что-то якобы простое: создать изображение тепловой карты (то есть 2D-гистограммы) с указанными попиксельными размерами (3600x3600) без полей или меток осей вообще .

Я могу успешно создать матрицу своих данных с помощью функции hist2d. Однако, когда я строю график, используя следующий код, я получаю файл изображения, который действительно имеет размер 3600x3600, но на самом деле содержит отметки по осям X и Y и некоторые пробелы по краям. Досадно, что этот пробел не является изотропным - с разных сторон его различное количество, поэтому я не могу просто сделать исходное изображение немного больше, прочитать его в PhotoShop и обрезать до 3600x3600, чтобы охватить только сюжет пиксели области (хотя это будет трудоемко).

par(mar=c(0,0,0,0)) # this *should* eliminate all margins, leaving only the plot area... right?
png("filename.png", w=3600, h=3600)
image(my_matrix, col=heat.colors(16))
dev.off()

Странно, но эти ярлыки и пробелы не появляются, если я просто нанесу изображение в кварцевом окне (я на MacBook Pro, к вашему сведению):

image(my_matrix, col=heat.colors(16)) # opens new window that looks perfect!

Это бы хорошо работало, но я не могу (насколько я знаю) указать размер этого графика в пикселях , просто в дюймах (через пин-код). Поэтому я не могу просто сохранить это окно графика, чтобы получить точный PNG, который я хочу.

Я уже потратил несколько дней на это и никуда не денусь. Любая помощь? Есть ли какая-то странность в том, как параметр par (mar) взаимодействует с определенными «устройствами» печати или что-то в этом роде? ...

Ответы [ 2 ]

5 голосов
/ 01 октября 2011

Если я ставлю par вызов после активации устройства, оно работает (вместе с настройкой axes = FALSE, чтобы избавиться от осей:

png("~/Desktop/so/heatmap.png",w=400,h=400)
par(mar = c(0,0,0,0))
require(grDevices) # for colours
x <- y <- seq(-4*pi, 4*pi, len=27)
r <- sqrt(outer(x^2, y^2, "+"))
image(z = z <- cos(r^2)*exp(-r/6), col=gray((0:32)/32),axes = FALSE)
dev.off()

enter image description here

Очевидно, что в этом примере я использовал меньшие размеры изображения. Этот пример кода взят из ?image.

1 голос
/ 01 октября 2011

Выполните par(mar=c(0,0,0,0)) после вызова png, а не до.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...