2012-10-21 5 views
39

Ich habe eine 3-Säulen-Matrix; Die Diagramme werden anhand von Punkten erstellt, die auf den Werten für Spalte 1 und Spalte 2 basieren, aber basierend auf Spalte 2 (6 verschiedene Gruppen) farbig sind. Ich kann alle Punkte erfolgreich darstellen, jedoch maskiert die letzte Diagrammgruppe (Gruppe 6), der die Farbe Lila zugewiesen wurde, die Diagramme der anderen Gruppen. Gibt es eine Möglichkeit, die Handlungspunkte transparenter zu machen?Gibt es eine Möglichkeit, Plotpunkte im Streudiagramm in R transparenter zu machen?

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) 

Antwort

56

Ansonsten haben Sie Funktion alpha in Paket scales, in dem Sie direkt geben Sie Ihren Vektor der Farben (auch wenn sie Faktoren wie in Ihrem Beispiel sind):

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

Haben Sie etwas bedeuten wie diese

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) 

siehe ?rgb Details ?:.

+0

Es scheint, dass ich nur rgb-Einstellungen in einer einzigen Gruppe von Punkten hinzufügen. Wie kann ich das auf mehr als eine Gruppe anwenden? – Steve

+0

zB: zwei verschiedene Farben: 'Punkte ((1:10) +0,05, col = rgb (c (0, 0), c (1, 0), c (0, 1), rep (0,5, 2)) , pch = 16) '(Sie könnten den gleichen Ansatz für 6 verschiedene Farben verwenden) – sgibb

10

Wenn Sie sich für die Verwendung von ggplot2 entscheiden, können Sie die Transparenz überlappender Punkte mithilfe des Arguments alpha festlegen.

z.B.

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

Transparenz kann in codiert werden das Farbargument auch. Es sind nur noch zwei Hex-Zahlen, die eine Transparenz zwischen 0 (vollständig transparent) und 255 (vollständig sichtbar) codieren. Ich habe einmal diese Funktion geschrieben, um einem Farbvektor Transparenz hinzuzufügen, vielleicht ist es hier nützlich?

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) 
} 

Einige Beispiele:

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

Ich denke' 'adjustcolor' in Basis R (das' grDevices' Paket) macht etwas sehr ähnliches, obwohl es möglicherweise nicht so vollständig vektorisiert ist wie deins. –

+0

Hallo, Sacha! Entschuldigung, die Antwort "entführen" :-). Ich habe eine kurze Frage: Gibt es einen Weg in 'semPlot' und/oder' qgraph' [ausgezeichnete Pakete, übrigens!], Um Etiketten (d. H. Ladungen) von der Mitte der Kurven weg zu positionieren? Nicht entlang der Kurven, sondern im "senkrechten" Sinn. Ich würde lieber nicht auf die Low-Level-LaTeX-Route zurückgreifen. Vielen Dank! –

+0

Danke! Im Moment können Sie das Argument edge.label.position nur verwenden, um zu steuern, wo am Rand die Beschriftung gezeichnet wird. Ich werde versuchen, es umzusetzen! –

4

Wenn Sie den Hex-Codes verwenden, können Sie zwei weitere Ziffern am Ende des Codes fügen Sie den Alpha-Kanal zu repräsentieren:

Z.B. Halb Transparenz rot:

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