Тепловая карта двоичных данных с использованием R или Python

У меня есть набор двоичных данных 0 и 1, где 0 - отсутствие, а 1 - наличие события.

Пример набора данных выглядит следующим образом:

<code>events    germany    Italy 
Rain      0          1
hail      1          0
sunny     0          0
</code>

Я хочу получить черно-белое изображение этих данных в виде тепловой карты, прочитав данные из файла.

 Angelo01 мая 2012 г., 13:53
Я использую программное обеспечение MeV для этого, но каким-то образом (я думаю, из-за двоичной природы данных) результат либо полностью красный, либо полностью белый.
 mac01 мая 2012 г., 13:47
 Etienne Low-Décarie03 мая 2012 г., 16:35
Я предполагаю, что чтение данных из части файла является известным или отдельным вопросом?
 Paul Hiemstra01 мая 2012 г., 16:51
Посмотрите на геометрию плитки в ggplot2, чтобы найти хороший вариант.
 Hooked01 мая 2012 г., 15:43
@ Анджело Я полагаю, по тегам, что вы хотели бы видеть обаpython иR решение. Если это так, в следующий раз укажите это в вопросе.

Ответы на вопрос(5)

Решение Вопроса

С изменением формы и ggplot2 в R

library(reshape)
library(ggplot2)

dat <- data.frame(weather=c("Rain","Hail","Sunny"), Germany = c(0,1,0), Italy = c(1,0,0))

melt.data<-melt(dat, id.vars="weather", variable_name="country")

qplot(data=melt.data,
      x=country,
      y=weather,
      fill=factor(value),
      geom="tile")+scale_fill_manual(values=c("0"="white", "1"="red"))

 Angelo03 мая 2012 г., 16:02
приятно спасиб
 Etienne Low-Décarie26 мая 2012 г., 01:34
например. ? read.csv или любая другая функция чтения (readLines ...)
 Angelo25 мая 2012 г., 17:06
Как я могу дать входные данные в виде файла вместо dat <- data.frame (weather = c ("Rain", "Hail", "Sunny"), Germany = c (0,1,0), Italy = c (1,0,0)) эта строка

Редактироват: В ответ на комментарии ниже приведен пример файла данных (сохраненного на диске как «data.txt»):

Hail  0 1 0 0 0 0 0 1 0 0
Sunny 1 1 1 0 1 0 1 0 1 1

В питоне мы можем прочитать метки и построить эту «тепловую карту

from numpy import loadtxt
import pylab as plt

labels = loadtxt("data.txt", usecols=[0,],dtype=str)
A      = loadtxt("data.txt", usecols=range(1,10))

plt.imshow(A, interpolation='nearest', cmap=plt.cm.Reds)
plt.yticks(range(A.shape[0]), labels)

plt.show()
import pylab as plt

 Hooked01 мая 2012 г., 15:59
@ Angelo - это данные в файле, и выглядит ли этов точк как то, что опубликовано в вашем вопросе? Если так, я отредактирую свой вопрос, чтобы показать, как читать из файла - если нет, дайте мне знать, как выглядят ваши данные. Как оно стоитA являетс двоичная матрица (то есть двумерный массив нулей и единиц).
 Angelo01 мая 2012 г., 16:53
изображение хорошее, но очень маленькое. Как я могу увеличить размер изображения?
 Hooked01 мая 2012 г., 16:43
@ Анджело Я отредактировал ответ, чтобы немного точнее отразить ваши данные. Вы можете изменить «data.txt» на все, что вы хотите сейчас, метка должна быть извлечена из первого столбца, а последующие столбцы должны быть правильно извлечены.
 Angelo01 мая 2012 г., 16:25
Это своего рода подобная матрица данных из 133 строк и 4 столбцов, в которой столбец 1 содержит события, а столбец 2,3,4 содержит двоичные данные (0 или 1), указывающие, происходило ли это в этой стране или нет.
 Angelo01 мая 2012 г., 15:57
Как я могу прочитать двоичную матрицу вместо того, чтобы набирать A = [[0,1], [1,0], [0,0]]?

в R попробуй:

library(bipartite)
mat<-matrix(c(0,1,1,0,1,1),byrow=TRUE,nrow=3)
rownames(mat)<-c("Rain","hail","sunny")
colnames(mat)<-c("Germany","Italy")
visweb(mat,type="None")

для красных квадратов и контроля размера этикетки:

visweb(mat,type="None",labsize=2,square="b",box.col="red") 
 Angelo01 мая 2012 г., 14:20
Как я могу увеличить размер шрифта? это то, что я делаю 1. dat_matrix <-data.matrix (dat) 2. tiff ("senceGene.tiff ") 3. visweb (dat_matrix, type =" None ") 4. dev.off (). я получаю изображение с очень маленьким размером шрифта
 user1317221_G01 мая 2012 г., 15:05
азмер @plot можно контролировать с помощьюplotsize=12 я дума
 user1317221_G01 мая 2012 г., 14:49
labsize=2 сделает размер текста 2. попробуйте разные размеры, чтобы получить то, что вы хотите, т.visweb(mat,type="None",labsize=2)

Видеть?image. С вашими данными

dat <- data.matrix(data.frame(Germany = c(0,1,0), Italy = c(1,0,0)))
rownames(dat) <- c("Rain","Hail","Sunny")

Это сблизит нас:

image(z = dat, col = c("white","red"))

но было бы неплохо лучше обрабатывать метки осей ... Попробуйте:

op <- par(mar = c(5,5,4,2) + 0.1)
image(z = dat, col = c("white","red"), axes = FALSE)
axis(side = 1, labels = rownames(dat), 
     at = seq(0, by = 0.5, length.out = nrow(dat)))
axis(side = 2, labels = colnames(dat), at = c(0,1), las = 1)
box()
par(op)

Который дае

Чтобы получить тепловую карту наоборот, транспонируйтеdat (image(z = t(dat), ....)) и сделать вaxis() звонки, меняйside в2 во первых и1 во втором вызове (и переместитеlas = 1 на другой звонок. I.e.

op <- par(mar = c(5,5,4,2) + 0.1)
image(z = t(dat2), col = c("white","red"), axes = FALSE)
axis(side = 2, labels = rownames(dat2), 
     at = seq(0, by = 0.5, length.out = nrow(dat2)), las = 1)
axis(side = 1, labels = colnames(dat2), at = c(0,1))
box()
par(op)
 Gavin Simpson26 мая 2012 г., 08:06
См.? Read.table для большинства типов с разделителями. Если ваш «файл» более сложный, есть руководство по импорту / экспорту данных R. Найдите руководство по CRAN.
 Angelo25 мая 2012 г., 17:05
Как я могу прочитать файл, как и файл в вопросе, и получить тот же результат.

Вероятно, самое простое решение в базе R:

rownames(dat) = dat$weather
heatmap(as.matrix(dat[,2:3]), scale='none')

... при условии, что ваш фрейм данных называетсяdat. Тепловая карта не красивая, но она быстрая и простая. Первая строка не нужна. Он служит только для отображения меток погоды на тепловой карте.

Ваш ответ на вопрос