Как визуализировать трехмерную матрицу?
Как визуализировать трехмерную матрицу?
- первое измерение - координата х = разные университеты
- второе измерение - координата y = дисциплины или специальности (физика, математика, искусство...)
- третье измерение - цвет = разные годы
- размер кружков = количество статей по соответствующей дисциплине / вуз
4 ответа
Используя пример данных @alexis_laz:
Реорганизовать данные, чтобы быть ggplot2
-дружелюбный:
library("reshape2")
mm <- melt(mat)
Загрузка пакетов (в том числе viridis
для более красивых цветов):
library("ggplot2"); theme_set(theme_bw())
library("viridis")
Составьте график в соответствии с запросом (играйте с диапазонами размеров, пока не получите результат):
ggplot(mm)+
geom_point(aes(x=univ,y=dis,colour=yr, size=value))+
scale_color_viridis()+
scale_size(range=c(2,18))
Тем не мение,
ggplot2
дает вам большую свободу, и я бы посоветовал вам обратить внимание на иерархию Кливленда, которая гласит, что трудно различить количественные характеристики, построенные по размеру. В зависимости от того, какие сравнения вас больше всего интересуют, вы можете попробовать что-то вроде этого:
library(grid) ## for unit(), to squash panels
ggplot(mm,aes(x=yr,y=value,colour=univ))+
geom_point()+geom_line()+
facet_wrap(~dis)+
scale_color_brewer(palette="Set1")+
theme(panel.margin=unit(0,"lines"))
(Конечно, данные выглядят как беспорядок, потому что они генерируются случайным образом...)
Предполагая, что у вас есть данные, такие как:
set.seed(911)
mat = tapply(sample(0:200, 5*10*16, TRUE, prob = rev(prop.table(0:200))),
expand.grid(univ = paste("univ", 1:5, sep = ""),
dis = paste("dis", 1:10, sep = ""),
yr = 2000:2015),
I)
Вы можете попробовать что-то вроде:
#convert to easy to manipulate format
DF = as.data.frame(as.table(mat))
#x
xlvs = unique(DF$univ)
xx = match(DF$univ, xlvs)
#y
ylvs = unique(DF$dis)
yy = match(DF$dis, ylvs)
#colors
collvs = unique(DF$yr)
cols = terrain.colors(length(collvs), alpha = 0.75)[match(DF$yr, collvs)]
#sizes
maxcex = 5
cexs = (DF$Freq * maxcex) / max(DF$Freq)
layout(matrix(c(1, 1, 1, 1, 1, 2), nrow = 1))
#plot 1
plot(xx, yy, col = cols, cex = cexs, pch = 19, axes = FALSE, frame.plot = TRUE)
axis(1, at = seq_along(xlvs), labels = xlvs)
axis(2, at = seq_along(ylvs), labels = ylvs, las = 1)
#plot 2
par(mar = c(1, 1, 1, 4))
fill = terrain.colors(length(collvs) * 9, alpha = 0.75) #higher 'resolution' of plot
barplot(matrix(rep_len(1L, length(fill))), col = fill, border = NA, axes = FALSE)
axis(4, at = seq(1, length(fill), 9) + 4, labels = collvs, las = 1)
==================== данных ============
цитируемый год
1 Beijing Physics 193 4555 2005
2 Beijing Physics 197 2799 2006
3 Beijing Physics 240 2664 2007
4 Beijing Physics 200 3191 2008
5 Beijing Physics 268 2668 2009
6 Beijing Physics 249 2300 2010
7 Beijing Physics 262 2080 2011
8 Beijing Physics 230 2371 2012
9 Beijing Physics 309 1367 2013
10 Beijing Physics 284 615 2014
11 Пекинская химия 143 1650 2005
12 Пекинская химия 149 2379 2006
13 Beijing Chemistry 190 2566 2007
14 Пекинская химия 147 1888 2008
15 Beijing Chemistry 184 2146 2009
16 Beijing Chemistry 214 2568 2010
---
mm <- read.table("data.txt", header = TRUE, sep = "", encoding='UTF-8')
library("ggplot2")
theme_set(theme_bw())
library("viridis")
ggplot(mm)+
geom_point(aes(x=univ,y=dis,colour=year, size=paper))+
scale_color_viridis()+
scale_size(range=c(2,18))
================================================== ======== но год становится 2005.0 2007.5 2010.0 2012.5 введите описание изображения здесь
Вы можете сделать что-то вроде
fulldata <- read.csv(...) # your data.frame
colors=c(...) # create your color array here
plot(NULL,xlim=1:9,ylim=1:20) # just to define the area of the graph
abline(v=1:9,h=1:20) # the axis inside the graph
for (y in 2013:2002) {
data <- fulldata[which(fulldata$year == y),]
circle(data$university,data$discipline,size=data$numberofpapers,col=year[y-2001])
}
axis(...) # or mtext or whatever to put the labels on the axis