2012-10-21 4 views
39

Ho una matrice a 3 colonne; i grafici sono costituiti da punti basati sui valori della colonna 1 e della colonna 2, ma colorati in base alla colonna 2 (6 diversi gruppi). Posso con successo tracciare tutti i punti, tuttavia, l'ultimo gruppo di grafici (gruppo 6) a cui è stato assegnato il colore viola, maschera i grafici degli altri gruppi. C'è un modo per rendere più trasparenti i punti della trama?Un modo per rendere più trasparenti i punti di tracciamento nello scatterplot in R?

s <- read.table("/.../parse-output.txt", sep="\t") 
dim(s) 
[1] 67124  3 
x <- s[,1] 
y <- s[,2] 
z <- s[,3] 
cols <- cut(z, 6, labels = c("pink", "red", "yellow", "blue", "green", "purple")) 
plot(x, y, main= "Fragment recruitment plot - FR-HIT", ylab = "Percent identity", xlab = "Base pair position", col = as.character(cols), pch=16) 

risposta

56

In caso contrario, la funzionalità dei alpha nel pacchetto scales in cui è possibile immettere direttamente il vostro vettore di colori (anche se sono fattori come nel tuo esempio):

library(scales) 
cols <- cut(z, 6, labels = c("pink", "red", "yellow", "blue", "green", "purple")) 
plot(x, y, main= "Fragment recruitment plot - FR-HIT", 
    ylab = "Percent identity", xlab = "Base pair position", 
    col = alpha(cols, 0.5), pch=16) 
# For an alpha of 0.5, i. e. a transparency of 50%. 
27

vuoi dire qualcosa di simile ?:

plot(1:10, col=rgb(1, 0, 0, 0.5), pch=16) 
points((1:10)+0.05, col=rgb(0, 0, 1, 0.5), pch=16) 

vedere ?rgb per i dettagli.

+0

Sembra Posso solo aggiungere impostazioni RGB per un singolo gruppo di punti. Come posso applicare questo a più di 1 gruppo? – Steve

+0

es .: due colori diversi: 'punti ((1:10) +0.05, col = rgb (c (0, 0), c (1, 0), c (0, 1), rep (0.5, 2)) , pch = 16) '(puoi usare lo stesso approccio per 6 colori diversi) – sgibb

10

Se si decide di utilizzare ggplot2, è possibile impostare la trasparenza dei punti di sovrapposizione utilizzando l'argomento alpha.

ad es.

library(ggplot2) 
ggplot(diamonds, aes(carat, price)) + geom_point(alpha = 1/40) 
15

trasparenza può essere codificato in anche l'argomento dei colori. Sono solo altri due numeri esadecimali che codificano una trasparenza tra 0 (completamente trasparente) e 255 (completamente visibile). Una volta ho scritto questa funzione per aggiungere trasparenza a un vettore di colore, forse è utile qui?

addTrans <- function(color,trans) 
{ 
    # This function adds transparancy to a color. 
    # Define transparancy with an integer between 0 and 255 
    # 0 being fully transparant and 255 being fully visable 
    # Works with either color and trans a vector of equal length, 
    # or one of the two of length 1. 

    if (length(color)!=length(trans)&!any(c(length(color),length(trans))==1)) stop("Vector lengths not correct") 
    if (length(color)==1 & length(trans)>1) color <- rep(color,length(trans)) 
    if (length(trans)==1 & length(color)>1) trans <- rep(trans,length(color)) 

    num2hex <- function(x) 
    { 
    hex <- unlist(strsplit("ABCDEF",split="")) 
    return(paste(hex[(x-x%%16)/16+1],hex[x%%16+1],sep="")) 
    } 
    rgb <- rbind(col2rgb(color),trans) 
    res <- paste("#",apply(apply(rgb,2,num2hex),2,paste,collapse=""),sep="") 
    return(res) 
} 

Alcuni esempi:

cols <- sample(c("red","green","pink"),100,TRUE) 

# Fully visable: 
plot(rnorm(100),rnorm(100),col=cols,pch=16,cex=4) 

# Somewhat transparant: 
plot(rnorm(100),rnorm(100),col=addTrans(cols,200),pch=16,cex=4) 

# Very transparant: 
plot(rnorm(100),rnorm(100),col=addTrans(cols,100),pch=16,cex=4) 
+11

Penso che'? adjustcolor' in base R (il pacchetto 'grDevices') fa qualcosa di molto simile a questo, anche se potrebbe non essere completamente vettorizzato come il tuo. –

+0

Ciao, Sacha! Mi dispiace "dirottare" la risposta :-). Ho una domanda veloce: c'è un modo in 'semPlot' e/o' qgraph' [pacchetti eccellenti, a proposito!] Per posizionare le etichette (cioè i carichi) lontano dal centro delle curve? Non lungo le curve, ma lontano in senso "perpendicolare". Preferirei non ricorrere ad una rotta LaTeX di basso livello. Grazie! –

+0

Grazie! Al momento non è possibile utilizzare l'argomento edge.label.position per controllare dove sul bordo è disegnata l'etichetta. Proverò a implementarlo! –

4

Se si sta utilizzando i codici esadecimali, è possibile aggiungere altri due cifre alla fine del codice per rappresentare il canale alfa:

Ad es mezzo rosso-trasparenza:

plot(1:100, main="Example of Plot With Transparency") 
lines(1:100 + sin(1:100*2*pi/(20)), col='#FF000088', lwd=4) 
mtext("use `col='#FF000088'` for the lines() function") 

example plot of color with transparency