2017-10-26 1 views
2

Bitte helfen Sie mir, glatte Linien (dicke schwarze Linien, wie in der Abbildung gezeigt) zu einem R-Pyramidenplot hinzuzufügen, wie im angehängten Bild gezeigt. Schätze deine Hilfe. This plot shows the population distribution according to the age and gender.Glatte Linie zu R-Pyramidenplots hinzufügen

xy.pop<-c(3.2,3.5,3.6,3.6,3.5,3.5,3.9,3.7,3.9,3.5,3.2,2.8,2.2,1.8,1.5,1.3,0.7,0.4) 
xx.pop<-c(3.2,3.4,3.5,3.5,3.5,3.7,4,3.8,3.9,3.6,3.2,2.5,2,1.7,1.5,1.3,1,0.8) 
agelabels<-c("0-4","5-9","10-14","15-19","20-24","25-29","30-34", 
     "35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74", 
     "75-79","80-44","85+") 
mcol<-color.gradient(c(0,0,0.5,1),c(0,0,0.5,1),c(1,1,0.5,1),18) 
fcol<-color.gradient(c(1,1,0.5,1),c(0.5,0.5,0.5,1),c(0.5,0.5,0.5,1),18) 
par(mar=pyramid.plot(xy.pop,xx.pop,labels=agelabels,main="Australian population pyramid 2002",lxcol=mcol,rxcol=fcol,)) 
+0

Bilder sind nicht sehr nützlich, um Menschen zu helfen begonnen. Können Sie Ihre Beispieldaten und den Code zum Generieren des Plots posten? Dann können wir es von dort nehmen. –

+0

Es tut mir leid, dass ich die Codes, die ich verwendet habe, nicht veröffentlicht habe. Ich habe gerade ein Code-Snippet gepostet. Vielen Dank für Ihren Kommentar. – Lank

Antwort

4

Wie über die folgenden (mit ggplot eher als Basis R-Grafiken). sowohl die männliche als auch weibliche Pyramide Hälften

# Your data 
xy.pop<-c(3.2,3.5,3.6,3.6,3.5,3.5,3.9,3.7,3.9,3.5,3.2,2.8,2.2,1.8,1.5,1.3,0.7,0.4) 
xx.pop<-c(3.2,3.4,3.5,3.5,3.5,3.7,4,3.8,3.9,3.6,3.2,2.5,2,1.7,1.5,1.3,1,0.8) 
agelabels<-c("0-4","5-9","10-14","15-19","20-24","25-29","30-34", 
      "35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74", 
      "75-79","80-44","85+") 

# Collect data in dataframe 
df <- rbind.data.frame(
    cbind.data.frame(Percentage = -xy.pop, Group = agelabels, Gender = "male"), 
    cbind.data.frame(Percentage = +xx.pop, Group = agelabels, Gender = "female")); 

# Make sure agelabels have the right order 
df$Group <- factor(df$Group, levels = agelabels); 

# (gg)plot 
gg <- ggplot(
    data = df, 
    aes(x = Group, y = Percentage, fill = Gender, group = Gender)); 
gg <- gg + geom_bar(data = subset(df, Gender == "female"), stat = "identity"); 
gg <- gg + geom_bar(data = subset(df, Gender == "male"), stat = "identity"); 
gg <- gg + coord_flip(); 
gg <- gg + geom_smooth(
    colour = "black", method = "loess", se = FALSE, show.legend = FALSE, size = 0.5); 
gg <- gg + labs(
    x = "Age", 
    y = "Percentage", 
    title = "Australian population pyramid 2012"); 
gg <- gg + scale_y_continuous(
    breaks = seq(-4, 4, by = 2), 
    labels = c(rev(seq(0, 4, by = 2)), seq(2, 4, by = 2))); 
print(gg); 

enter image description here

ich separat eine LOESS Kurve hier bin bei der Montage (durch die group Ästhetik).

Es ist nicht ganz die gleiche Handlung wie die, die Sie zeigen, aber es gibt noch Raum für Verbesserungen/Optimierungen. Zum Beispiel können Sie die Ästhetik fill ändern, um eine prozentuale Füllung der Balken zu erreichen.

Kredit, wo Kredit fällig ist: Diese Lösung basiert auf this post auf SO von @DidzisElferts.

+0

Vielen Dank für Ihre schnelle Antwort. Ihre Antwort passt im Moment zu meiner Anforderung. – Lank

+0

Keine Sorgen. Froh, dass es geholfen hat. –

1

Hier ist eine Lösung mit der pyramid.plot Funktion von plotrix:

library(plotrix) 

pyramid.plot(xy.pop,xx.pop,labels=agelabels, 
      main="Australian population pyramid 2002",lxcol=mcol,rxcol=fcol) 

male.smline <- loess.smooth(x=1:18, y=xy.pop, degree=2) 
lines(-1-male.smline$y, male.smline$x, col="red", lwd=3) 

female.smline <- loess.smooth(x=1:18, y=xx.pop, degree=2) 
lines(1+female.smline$y, female.smline$x, col="black", lwd=3) 

enter image description here

+0

Danke Marco, sieht gut aus! – Lank

+0

@Lank Ich freue mich, dass es dir gefällt! Könnten Sie bitte meine Antwort verbessern? Vielen Dank. –

Verwandte Themen