Y a-t-il un moyen de rendre les points de tracé dans scatterplot plus transparents dans R?
j'ai une matrice de 3 colonnes; les tracés sont faits par des points basés sur les valeurs de la colonne 1 et de la colonne 2, mais colorés basés sur la colonne 2 (6 groupes différents). Je peux tracer avec succès tous les points, cependant, le dernier groupe de parcelles (groupe 6) qui a été assigné la couleur Pourpre, masque les parcelles des autres groupes. Y a-t-il un moyen de rendre l'intrigue plus transparente?
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)
5 réponses
sinon, vous avez une fonction alpha
dans le paquet scales
dans laquelle vous pouvez directement saisir votre vecteur de couleurs (même si elles sont des facteurs comme dans votre exemple):
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.4), pch=16)
# For an alpha of 0.4, i. e. an opacity of 40%.
Lors de la création des couleurs, vous pouvez utiliser rgb
et définissez sa alpha
argument:
plot(1:10, col = rgb(red = 1, green = 0, blue = 0, alpha = 0.5),
pch = 16, cex = 4)
points((1:10) + 0.4, col = rgb(red = 0, green = 0, blue = 1, alpha = 0.5),
pch = 16, cex = 4)
consultez ?rgb
pour plus de détails.
la transparence peut aussi être codée dans l'argument couleur. Il ne s'agit que de deux nombres hexadécimaux supplémentaires codant une transparence entre 0 (entièrement transparent) et 255 (entièrement visible). J'ai écrit une fois cette fonction pour ajouter de la transparence à un vecteur de couleur, peut-être qu'il est utile ici?
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("0123456789ABCDEF",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)
}
Quelques exemples:
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)
Si vous décidez d'utiliser ggplot2
, Vous pouvez définir la transparence des points qui se chevauchent en utilisant le alpha
argument.
e.g.
library(ggplot2)
ggplot(diamonds, aes(carat, price)) + geom_point(alpha = 1/40)
Si vous utilisez les codes hex, vous pouvez ajouter deux chiffres à la fin du code pour représenter le canal alpha:
E. G. rouge demi-transparent:
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")