2012-07-23 15 views
8

Uso el código R a continuación para crear un diagrama de burbujas.Cómo utilizar R para crear diagramas de burbujas con rellenos de degradado

pdf(file='myfigure.pdf',height=10,width=13) 
y<-c(123,92,104,23,17,89,13) 
x<-c(11,45,24,50,18,7,2) 
size<-c(1236,1067,1176,610,539,864,1026) 
radius<-sqrt(size/pi) 
col<-c(2,2,3,4,5,5,6) 
name<-c("Acura", "Alfa Romeo","AM General","Aston Martin Lagonda","Audi","BMW","Bugatti") 

symbols(x,y, circles=radius,fg="white",bg=col,ylim=c(-20,140)) 
text(x, y, name, cex=1.5,font=4) 
dev.off() 

enter image description here Pero quiero las burbujas con la superficie 3d, dicen los rellenos degradados y sombras. como el cuadro a continuación. enter image description here

¿Alguien sabe cómo usar R para lanzarlo? ¡Gracias!

Gracias por todas las sugerencias.Mientras que finalmente probé de una manera tonta dibujando círculos múltiples de la oscuridad a la luz para que se llene de degradado. Alguna sugerencia para hacerlo mejor? ¡Gracias! enter image description here

makeTransparent<-function(someColor, alpha) 
{ 
newColor<-col2rgb(someColor) 
apply(newColor, 2, function(curcoldata){rgb(red=curcoldata[1], green=curcoldata[2],           blue=curcoldata[3],alpha=alpha,maxColorValue=255)}) 
} 

pdf(file='myfigure.pdf',height=10,width=13) 
y<-c(123,92,104,23,17,89,13) 
x<-c(11,45,24,50,18,7,2) 
size<-c(1236,1067,1176,610,539,864,1026) 
radius<-sqrt(size/pi) 
col<-c(2,2,3,4,5,5,6) 
name<-c("Acura", "Alfa Romeo","AM General","Aston Martin Lagonda","Audi","BMW","Bugatti") 


x2<-c() 
y2<-c() 
circles<-c() 
bg<-c() 
fg<-c() 

num<-30 
radius_min<-0.3 
alpha_min<-40 
alpha_max<-180 

for (i in 1:num){ 

x2<-c(x2,x) 
y2<-c(y2,y) 
circles<-c(circles,radius*(radius_min+(i-1)*(1-radius_min)/num)) 
bg<-c(bg,makeTransparent(col,alpha=alpha_max-(i-1)*(alpha_max-alpha_min)/num)) 
if(i!=num){fg<-c(fg,makeTransparent(col,alpha=alpha_max-(i-1)*(alpha_max-alpha_min)/num))}else{fg<-c(fg,rep('white',length(x)))} 


} 




symbols(x2,y2,circles=circles,fg=fg,bg=bg) 
text(x, y, name, cex=1.5,font=4) 
dev.off() 
+6

Si te gusta ese tipo de efecto, R puede ser que no sea la herramienta adecuada para usted. Las capacidades gráficas en R fueron diseñadas y construidas por personas a las que realmente no les gusta ese tipo de cosas, por lo tanto, si bien es posible, sospecho que no será conveniente. – joran

+0

@Joran su punto está bien, pero es una consulta interesante, y aunque nunca lo use, sería interesante ver una solución (para impresionar a algún jefe corporativo que le gusta este tipo de cosas). –

+1

@TylerRinker El interés es una cuestión de opinión, pero ciertamente no quise sugerir que es una mala pregunta. Solo intento guardar el OP en algún momento en caso de que una herramienta diferente sea más apropiada. – joran

Respuesta

6

Aquí es una solución (inspirado por @ solución de Edward como this question):

#First your data: 
y<-c(123,92,104,23,17,89,13) 
x<-c(11,45,24,50,18,7,2) 
size<-c(1236,1067,1176,610,539,864,1026) 
radius<-sqrt(size/pi) 
col<-c(2,2,3,4,5,5,6) 
name<-c("Acura", "Alfa Romeo","AM General","Aston Martin Lagonda","Audi","BMW","Bugatti") 

#Then a simple function to draw a circle based on its center and its radius: 
circle <- function (r, x0, y0, col){ 
    t <- seq(0, 2 * pi, by = 0.01) 
    x <- r * cos(t) + x0 
    y <- r * sin(t) + y0 
    lines(x, y, col=col) 
    } 

#This is a smoothing factor: 
sm <- 500 

#The asp parameter is important here since we are actually drawing the circles and not plotting some circle symbols: if asp is not equal to 1 they will appear as ellipse. 
plot(x,y,type="n",asp=1) 

#This can probably be vectorized but I'm not a good vectorizer so if anyone wants to give it a try: 
for(j in 1:length(x)){ 
    radius[j]*sm:1/sm -> radiuses 
    colorRampPalette(c(palette()[col[j]], "white"))->col_grad 
    col_grad(length(radiuses))->colx 
    for(i in 1:length(radiuses)){circle(radiuses[i], x[j], y[j], col=colx[i])} 
    } 

text(x, y, name, cex=1.5,font=4) 

Ver ?colorRampPalette para obtener más información sobre cómo funciona esta función.

enter image description here

Editar: con sombras

offset<-c(2,-2) #Offset of the shadow circles 
library(scales) #For function alpha 

plot(x,y,type="n",asp=1) 

for(j in 1:length(x)){ 
    radius[j]*sm:1/sm -> radiuses 
    colorRampPalette(c(palette()[col[j]], "white"))->col_grad 
    col_grad(length(radiuses))->colx 
    for(i in 1:length(radiuses)){circle(radiuses[i], x[j]+offset[1], y[j]+offset[2], col=alpha("grey90",0.1))} #the alpha, the nuance of grey can be tweaked with obviously for the desired effect 
    for(i in 1:length(radiuses)){circle(radiuses[i], x[j], y[j], col=colx[i])} 
    } 

text(x, y, name, cex=1.5,font=4) 

enter image description here

+0

Agradable. Quizás también puedas soltar una sombra. –

+0

De hecho (al agregar un desplazamiento a xey) pero como el área más clara está en el centro de mis "esferas", la luz es perpendicular a la pantalla, por lo que la sombra debe ocultarse y, por lo tanto, no se puede ver en toda la lógica :) – plannapus

+0

Tal vez puedas imaginar que hay otra fuente de luz débil en una de las esquinas, lo que da como resultado una sombra leve. :) –

Cuestiones relacionadas