2013-08-22 3 views
-1

Я пытаюсь для построения данных выглядит следующим образом:участок матрицы с тремя цветами

NA B B A B A NA B A NA 
B B B NA B B A B A B 
. 
. 
B B B NA A A B B A B 

for each line 
If A = red dot 
if B = black dot 
if NA = grey dot 

Может кто-нибудь помочь мне, как я могу сделать это

+0

@ SeñorO Я не Коула сделать это, но я пытался что-то вроде: сюжет (матрица, xlim = с (1, nrow), ylim = C (1, Ncol), тип = "п") sapply (1 : nrow, функция (Х) {точки (1: Ncol, Rep (X, Ncol), PCH = IfElse (матрица [1,] == "НС", 19, 1))}) – EpiMan

ответ

3

Ваш вопрос не очень понятно, но, возможно, что-то вроде это?

#some data 
set.seed(42) 
dat <- matrix(sample(c("A","B",NA), 25, TRUE), 5) 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] NA "B" "B" NA NA 
# [2,] NA NA NA NA "A" 
# [3,] "A" "A" NA "A" NA 
# [4,] NA "B" "A" "B" NA 
# [5,] "B" NA "B" "B" "A" 

#reshape, so ggplot likes it 
library(reshape2) 
df <- melt(t(dat)) 
df$value <- as.character(df$value) 

#to be able to plot NA values 
df$value[is.na(df$value)] <- "NA" 

library(ggplot2) 
ggplot(df, aes(x=Var1, y=-Var2, fill=value)) + 
    geom_tile() + 
    scale_x_continuous(expand=c(0,0), breaks=seq_len(max(df$Var1))) + 
    scale_y_continuous(expand=c(0,0), breaks=-seq_len(max(df$Var2)), 
        labels=seq_len(max(df$Var2))) + 
    scale_fill_manual(values=c("A"="red", "B"="black", "NA"="grey")) + 
    theme_bw() + 
    theme(axis.title=element_blank()) 

enter image description here

Если вы действительно предпочитаете точки, вы можете использовать geom_point.

Edit:

Если матрица имеет dimnames:

rownames(dat) <- letters[1:5] 
colnames(dat) <- letters[6:10] 
# f g h i j 
# a NA "B" "B" NA NA 
# b NA NA NA NA "A" 
# c "A" "A" NA "A" NA 
# d NA "B" "A" "B" NA 
# e "B" NA "B" "B" "A" 

#reshape, so ggplot likes it 
library(reshape2) 
df <- melt(t(dat)) 
df$value <- as.character(df$value) 

#to be able to plot NA values 
df$value[is.na(df$value)] <- "NA" 

#get the order of rows as in print(dat) 
df$Var1 <- factor(as.character(df$Var1), levels=colnames(dat), ordered=TRUE) 
df$Var2 <- factor(as.character(df$Var2), levels=rev(rownames(dat)), ordered=TRUE) 

library(ggplot2) 
ggplot(df, aes(x=Var1, y=Var2, fill=value)) + 
    geom_tile() + 
    scale_x_discrete(expand=c(0,0)) + 
    scale_y_discrete(expand=c(0,0)) + 
    scale_fill_manual(values=c("A"="red", "B"="black", "NA"="grey")) + 
    theme_bw() + 
    theme(axis.title=element_blank()) 

enter image description here

+0

, которое действительно большой, но я получил эту ошибку: ошибка в Summary.factor (с (1л, 12L, 20L, 21L, 22L, 23L, 24L, 25L, 26L,: макс не имеет смысла для факторов – EpiMan

+0

я добавил, как это сделать, если ваша матрица имеет dimnames – Roland

1

Этот пример приведен только для показа в окровавленных деталях, как это может быть сделано. Это далеко не самый компактный код.

dmat[dmat=="A"]<-0 
dmat[dmat=="B"]<-1 
dmat[is.na(dmat)]<-2 
mycolors<-c('red','black','grey') 
# initial plot area 
plot(c(1,nrow(dmat)),c(1,ncol(dmat)),t='n') 

for (i in 1:nrow(dmat)){ 
    for(j in 1:ncol(dmat)) { 
     points(i,j,col=mycolors[dmat[i,j]]) 
     } 
    } 
+0

Я не знаю, почему я получаю эту ошибку: for (i in 1: nrow (dat)) { + for (j in 1: ncol (dat) { Ошибка: неожиданный '{' in: "для (я в 1: nrow (DAT)) { для (J в 1: Ncol (DAT) { " точек (I, J, Col = MyColors [DAT [I, J]])}} Ошибка: неожиданные '}' в" точках (I, J, COL = MyColors [DAT [I, J]])} " – EpiMan

+0

@MaryamSani Извините - я оставил скобку из в„для (J ...“линии. Исправлено. –

Смежные вопросы