У меня есть набор двоичных данных 0 и 1, где 0 - отсутствие, а 1 - наличие события.
Пример набора данных выглядит следующим образом:
events germany Italy
Rain 0 1
hail 1 0
sunny 0 0
Я хотел бы получить красную и белую картинку этих данных в виде карты тепла, читая данные из файла.
С изменением формы и 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"))
Изменить: В ответ на комментарии ниже приведен пример файла данных (сохраненного на диске как "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
A
является двоичной матрицей (т.е. двумерным массивом нулей и единиц).
См. ?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
на другой вызов. Т.е.:
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)
в 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")
labsize=2
сделает размер текста 2. попробуйте разные размеры, чтобы получить то, что вы хотите, например, visweb(mat,type="None",labsize=2)
Вероятно, самым простым решением в базе R является:
rownames(dat) = dat$weather
heatmap(as.matrix(dat[,2:3]), scale='none')
... предполагая, что ваш фрейм данных называется dat
. Тепловая карта не очень красивая, но это быстро и просто. Первая строка не нужна. Он служит только для того, чтобы показать ярлыки погоды в тепловой карте.