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

1

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

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

events    germany    Italy 
Rain      0          1
hail      1          0
sunny     0          0

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

  • 1
    Что вы пробовали?
  • 0
    Я использую программное обеспечение MeV для этого, но каким-то образом (я думаю из-за двоичной природы данных) результат либо полностью красный, либо полностью белый.
Показать ещё 3 комментария
Теги:

5 ответов

2
Лучший ответ

С изменением формы и 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"))

Изображение 174551

  • 0
    Хорошо.Спасибо
  • 0
    Как передать данные в виде файла вместо dat <- data.frame (weather = c («Дождь», «Hail», «Sunny»), Германия = c (0,1,0), Италия = c ( 1,0,0)) эта строка
Показать ещё 1 комментарий
5

Изменить: В ответ на комментарии ниже приведен пример файла данных (сохраненного на диске как "data.txt"):

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

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

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

Изображение 174551

  • 0
    Как я могу прочитать двоичную матрицу вместо того, чтобы набирать A = [[0,1], [1,0], [0,0]]?
  • 0
    @Angelo - это данные в файле, и они выглядят так же, как то, что опубликовано в вашем вопросе? Если так, я отредактирую свой вопрос, чтобы показать, как читать из файла - если нет, дайте мне знать, как выглядят ваши данные. В его нынешнем виде A является двоичной матрицей (т.е. двумерным массивом нулей и единиц).
Показать ещё 5 комментариев
4

См. ?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)

Который дает

Изображение 174551

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

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)
  • 0
    Как я могу прочитать файл, как файл в вопросе и по-прежнему получить тот же результат.
  • 0
    Смотрите? Read.table для большинства типов с разделителями. Если ваш «файл» более сложный, есть руководство по импорту / экспорту данных R. Найдите руководство по CRAN.
2

в R try:

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") 
  • 0
    Как я могу увеличить размер шрифта? это то, что я делаю 1. dat_matrix <-data.matrix (dat) 2. tiff ("senceGene.tiff ") 3. visweb (dat_matrix, type =" None ") 4. dev.off (). я получаю изображение с очень маленьким размером шрифта
  • 0
    labsize=2 сделает размер текста 2. попробуйте разные размеры, чтобы получить то, что вы хотите, например, visweb(mat,type="None",labsize=2)
Показать ещё 1 комментарий
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню