2012-10-21 7 views
39

Mam macierz 3 kolumn; wykresy są tworzone punktami opartymi na wartościach kolumny 1 i kolumny 2, ale kolorowane w oparciu o kolumnę 2 (6 różnych grup). Mogę z powodzeniem wykreślić wszystkie punkty, jednak ostatnia grupa plot (grupa 6), której przypisano kolor fioletowy, maskuje wykresy pozostałych grup. Czy istnieje sposób na zwiększenie przejrzystości punktów fabuły?Jakikolwiek sposób, aby punkty rzutu w wykresie rozrzutu były bardziej przezroczyste w 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) 

Odpowiedz

56

przeciwnym razie masz funkcję alpha w pakiecie scales w którym można bezpośrednio wprowadzić wektor kolorów (nawet jeśli są one czynniki jak w przykładzie):

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

Czy masz na myśli coś takiego ?:

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) 

proszę zobaczyć ?rgb szczegóły.

+0

Wydaje Mogę tylko dodać ustawienia RGB do jednej grupy punktów. Jak mogę zastosować to do więcej niż jednej grupy? – Steve

+0

np .: dwa różne kolory: 'punkty ((1:10) +0,05, col = rgb (c (0, 0), c (1, 0), c (0, 1), rep (0,5, 2)) , pch = 16) '(możesz użyć tego samego podejścia dla 6 różnych kolorów) – sgibb

10

Jeśli zdecydujesz się użyć ggplot2, możesz ustawić przezroczystość nakładających się punktów, używając argumentu alpha.

np.

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

Przejrzystość mogą być kodowane w także argument koloru. To tylko dwie kolejne liczby szesnastkowe, kodujące przezroczystość między 0 (całkowicie przezroczysty) a 255 (w pełni widoczny). Kiedyś napisałem tę funkcję, aby dodać przezroczystość do wektora kolorów, może jest to przydatne tutaj?

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

Kilka przykładów:

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

Myślę, że'? adjustcolor' w bazie R (pakiet 'grDevices') robi coś bardzo podobnego, chociaż może nie być tak w pełni wektorowy jak twoje. –

+0

Cześć, Sacha! Przepraszam, aby "przejąć" odpowiedź :-). Mam krótkie pytanie: czy istnieje sposób w 'semPlot' i/lub' qgraph' [doskonałe pakiety, nawiasem mówiąc!] Do położenia etykiet (tj. Ładunków) z dala od środka krzywych? Nie wzdłuż krzywych, ale daleko w sensie "prostopadłym". Wolałbym nie uciekać się do pójścia niskopoziomową trasą LaTeX. Dziękuję Ci! –

+0

Dzięki! Nie teraz, możesz użyć tylko argumentu edge.label.position, aby kontrolować, gdzie na krawędzi rysowana jest etykieta. Spróbuję to zaimplementować! –

4

Jeśli używasz kodów sześciokątne, można dodać dwie kolejne cyfry na końcu kodu do reprezentowania kanał alpha:

Np pół-przejrzystości czerwono:

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

Powiązane problemy