Sto creando un reticolo levelplot
da x
e y
fattori che variano da [0,1]:Come si specificano intervalli di colori diversi per livelli diversi?
x y level
1 m3134 m3134 1.0000000
2 m3134 m416B 0.4189057
3 m416B m3134 0.2696508
4 m3134 mA20 0.3322170
5 mA20 m3134 0.2454191
6 m3134 mB 0.3176792
...
Ecco lo script R che uso per fare la figura da questi dati:
#!/foo/bar/bin/Rscript --vanilla
args <- commandArgs(TRUE)
mtxFn <- args[1]
pdfFn <- args[2]
mtx <- read.table(mtxFn, col.names=c("x", "y", "level"))
mtx$level[(mtx$level == 1)] <- NA
library(lattice)
trellis.device(dev=pdf, file=pdfFn)
colors <- colorRampPalette(c('red', 'white'))(256)
fig <- levelplot(level~x*y,
data=mtx,
col.regions=colors,
xlab="",
ylab="",
aspect="iso",
scales=list(
x=list(rot=90)
),
panel=function(...) {
arg <- list(...)
panel.levelplot(...)
panel.text(mtx$x, mtx$y, round(mtx$level*100,0), cex=0.5)
}
)
print(fig)
graphics.off();
Questo funziona bene. Ottengo la figura seguente:
Tuttavia, invece di avere cellule marcate NA
, desidero lasciarli come 1.00
valori, ma il colore tutte le celle da 10 (a livello di 0.10
) e 79 (a livello di 0.79
) con colors
. Qualunque cosa maggiore di 79 diventa colorata con lo stesso colore di quello che viene applicato a una cella con il ca. livello di 79. O, preferibilmente, dette cellule sarebbero colorate di nero, senza alcun testo al loro interno.
C'è un modo per farlo con levelplot
e reticolo?
montaggio finale
Questo non dà molto di un gradiente di colori, ma sono abbastanza vicino che io attribuisco la bontà, e forse guardare in ggplot2
come alternativa. Grazie per tutto il tuo duro lavoro su questo.
Ecco il montaggio finale del mio script:
#! /foo/bar/bin/Rscript --vanilla
args <- commandArgs(TRUE)
dfFn <- args[1]
pdfFn <- args[2]
df <- read.table(dfFn,
col.names=c("x", "y", "level"),
stringsAsFactors=TRUE,
colClasses=c("factor", "factor", "numeric"))
df$level <- round(df$level*100, 0)
# reorder cell type row-factors (in reverse of given order)
df$y <- factor(df$y, levels=unique(df$y[length(df$y):1]))
lowestValue <- min(df$level)
secondHighestValue <- unique(sort(df$level, decreasing=TRUE))[2]
n <- 10
col.seq <- seq(lowestValue, secondHighestValue, length.out=n)
brks <- c(0, col.seq, Inf)
cuts <- cut(df$level, breaks = brks)
colors <- colorRampPalette(c("white", "red"))(length(levels(cuts))-1)
colors <- c(colors, "black")
cls <- rep(colors, times = table(cuts))
library(lattice)
trellis.device(dev=pdf, file=pdfFn)
fig <- levelplot(cuts~x*y,
data = df,
cuts = n,
col.regions=cls,
xlab="",
ylab="",
aspect="iso",
scales=list(
x=list(rot=90)
),
panel=function(...) {
arg <- list(...)
panel.levelplot(...)
panel.text(df$x, df$y, df$level, cex=0.5)
},
colorkey=list(col=colorRampPalette(c("white", "red"))(length(col.seq)), at=col.seq)
)
print(fig)
graphics.off()
Ecco la levelplot
che questo script fa:
Se io aumento n
sopra 15
, le interruzioni di colorazione delle cellule una volta di nuovo, tornando a una diagonale di rosso vivo, anziché nero (come mostrato).
avrei costruire bidoni utilizzando 'tagliate (x, pause = c (0, 1, seq (10, 79, 1), 80, Inf))' e assegnare un colore appropriato ognuno usa il tuo 'colorRampPalette'. Attraverso 'seq', puoi sempre creare un numero desiderabile di livelli. Per quanto riguarda i tuoi NA-s, lascia fuori la tua quinta affermazione. –
Si prega di consultare la mia risposta rivista. –
Puoi pubblicare un campione dei tuoi dati online (dropbox o somesuch)? –