2012-07-23 12 views
8

Ich verwende den R-Code unten, um ein Blasendiagramm zu erstellen.Verwendung von R zum Erstellen von Blasendiagrammen mit Farbverlaufsfüllungen

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 Aber ich die Blasen mit 3D-Oberfläche wollen, sagen Verlaufsfüllungen und Schatten. wie die Tabelle unten. enter image description here

Wer weiß, wie man R verwendet, um es zu veröffentlichen? Vielen Dank!

Vielen Dank für all die Vorschläge.Während schließlich versuchte ich eine alberne Art und Weise, indem Sie mehrere Kreise von dunkel nach hell zeichnen, um es Gradienten gefüllt zu machen. Irgendwelche Vorschläge, um es besser zu machen? Vielen Dank! 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

Wenn Sie diese Art von Wirkung, R nicht das richtige Werkzeug für Sie sein könnten. Die Grafikfähigkeiten in R wurden von Leuten entworfen und gebaut, die solche Dinge wirklich nicht mögen, also, obwohl es möglich ist, vermute ich, dass es nicht bequem sein wird. – joran

+0

@Joran Ihr Punkt ist gut gemacht, aber es ist eine interessante Abfrage, und obwohl ich nie verwenden werde, wäre es immer noch interessant, eine Lösung zu sehen (für einige Firmenchef beeindrucken, der so etwas mag). –

+1

@TylerRinker Interessantes ist eine Frage der Meinung, aber ich wollte damit nicht sagen, dass es eine schlechte Frage ist. Versuchen Sie einfach, das OP einige Zeit zu speichern, falls ein anderes Tool angemessener wäre. – joran

Antwort

6

Hier ist eine Lösung (inspiriert von @ Edwards Lösung für 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) 

?colorRampPalette finden Sie weitere Informationen darüber, wie diese Funktion arbeitet.

enter image description here

Edit: mit Schatten

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

Schön. Vielleicht könntest du auch einen Schatten werfen. –

+0

Tatsächlich (durch Hinzufügen eines Versatzes zu x und y), aber da der hellere Bereich in der Mitte meiner "Sphären" ist, ist das Licht senkrecht zum Bildschirm, so dass der Schatten durch die Sphäre selbst verborgen und daher überhaupt nicht gesehen werden sollte in aller Logik :) – plannapus

+0

Vielleicht könntest du dir vorstellen, dass es in einer der Ecken noch eine schwache Lichtquelle gibt, die zu einem leichten Schatten führt. :) –

Verwandte Themen