2016-12-25 1 views
1

Ich habe diesen Beitrag Two horizontal bar charts with shared axis in ggplot2 (similar to population pyramid) und ähnliche, die mir nicht helfen konnten, mein Problem zu lösen, weil meine Daten anders sind. Wo ich versuche unterWie kann ich meine Daten nebeneinander barplot mit Punkten

zu erklären, habe ich ein Datum wie unter

dfm<- structure(list(Var1 = structure(1:35, .Label = c("F10", "F11", 
"F12", "F13", "F14", "F15", "F16", "F18", "F19", "F2", "F21", 
"F25", "F3", "F30", "F35", "F4", "F5", "F58", "F6", "F60", "F7", 
"F79", "F8", "F9", "F97", "F117", "F17", "F22", "F23", "F26", 
"F31", "F41", "F61", "F67", "F87"), class = "factor"), Freq.x = c(4L, 
1L, 2L, 3L, 4L, 1L, 2L, 2L, 1L, 252L, 1L, 2L, 106L, 1L, 1L, 56L, 
32L, 1L, 28L, 1L, 17L, 1L, 10L, 7L, 1L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA), Freq.y = c(12L, 3L, 6L, NA, 7L, NA, 1L, NA, 
2L, 306L, 1L, 2L, 170L, NA, NA, 69L, 45L, NA, 35L, NA, 20L, NA, 
13L, 7L, NA, 1L, 3L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L)), .Names = c("Var1", 
"Freq.x", "Freq.y"), row.names = c(NA, -35L), class = "data.frame") 

Ich habe eine gegenseitige Spalte namens Var1 und zwei Spalten Freq.x und Freq.y ich in vertikaler Hinsicht plotten BarPlot will und Setzen Sie einen red oder blue Punkt oben in jedem Balken.

Ich mag die Freq.x auf der rechten Seite plotten, Freq.y auf der linke Seite und die F2 ... in der Mitte sowohl als Y-Achse

So etwas wie diese

enter image description here

Ich habe viele Dinge ausprobiert, aber ich konnte es nicht schaffen.

Die nächstgelegene ich habe ist mit dem folgenden Code

par(mfrow=c(1,2)) 
barplot(dfm$Freq.y,axes=F,horiz=T,axisnames=FALSE) 
axis(side=1,at=seq(1,252,50)) 
barplot(dfm$Freq.x,horiz=T,axes=T,las=1) 

Wenn Sie nur die Figur als den oben genannten Post plotten, Sie sehen, dass es falsch Figur für meine Daten zum Beispiel schenkt

library(grid) 
g.mid<-ggplot(dfm,aes(x=1,y=Var1))+geom_text(aes(label=Var1))+ 
    geom_segment(aes(x=0.94,xend=0.96,yend=Var1))+ 
    geom_segment(aes(x=1.04,xend=1.065,yend=Var1))+ 
    ggtitle("")+ 
    ylab(NULL)+ 
    scale_x_continuous(expand=c(0,0),limits=c(0.94,1.065))+ 
    theme(axis.title=element_blank(), 
     panel.grid=element_blank(), 
     axis.text.y=element_blank(), 
     axis.ticks.y=element_blank(), 
     panel.background=element_blank(), 
     axis.text.x=element_text(color=NA), 
     axis.ticks.x=element_line(color=NA), 
     plot.margin = unit(c(1,-1,1,-1), "mm")) 


g1 <- ggplot(data = dfm, aes(x = Var1, y = Freq.x)) + 
geom_bar(stat = "identity") + ggtitle("Number of sales staff") + 
theme(axis.title.x = element_blank(), 
axis.title.y = element_blank(), 
axis.text.y = element_blank(), 
axis.ticks.y = element_blank(), 
plot.margin = unit(c(1,-1,1,0), "mm")) + 
scale_y_reverse() + coord_flip() 

g2 <- ggplot(data = dfm, aes(x = Var1, y = Freq.y)) +xlab(NULL)+ 
geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") + 
theme(axis.title.x = element_blank(), axis.title.y = element_blank(), 
axis.text.y = element_blank(), axis.ticks.y = element_blank(), 
plot.margin = unit(c(1,0,1,-1), "mm")) + 
coord_flip() 

library(gridExtra) 
gg1 <- ggplot_gtable(ggplot_build(g1)) 
gg2 <- ggplot_gtable(ggplot_build(g2)) 
gg.mid <- ggplot_gtable(ggplot_build(g.mid)) 

grid.arrange(gg1,gg.mid,gg2,ncol=3,widths=c(4/9,1/9,4/9)) 

enter image description here siehe die Handlung und schauen Sie sich zum Beispiel die F2-Werte für beide dfs Sie sehen? beide sind die höchsten Werte, aber in diesem Diagramm zeigen sie am wenigsten über die zweite Antwort. Sie Kerl schmelzen die Daten und es machte mich verrückt, meine Daten zu schmelzen, so dass ich nicht herausfinden konnte, wie man es auf der Grundlage dieser über die dritte, es ist völlig aus meinem Interesse heraus, weil ich nur eine Handlung mit meinen Daten brauchen und es nicht

nach Zuweisung der g.mid Spaltung, ist es nicht die Reihenfolge berücksichtigt werden, beginnt es von 87 bis zum Ende, während die Reihenfolge meiner dfm beginnt von 2

enter image description here

+0

wo Ihre g.mid definiert? –

+0

@sandipan Ich habe das oben hinzugefügt, aber es gibt viele Probleme damit. zum Beispiel ist es gut, wenn man den Datenbereich kennt und die richtigen Werte nicht der richtigen 'yaxis'etc zuweist. – nik

Antwort

2

für die roten und blauen Punkten. Sie können +geom_point(aes(x = Var1, y = Freq.x),shape=19,size=6,color="red")+ und geom_point(aes(x = Var1, y = Freq.y),shape=19,size=6,color="blue")+ hinzufügen. Versuchen Sie diesen Code (mit @ cuttlefish44 ‚s Hilfe):

library(dplyr) 
ind <- gsub("F", "", dfm$Var1) %>% as.numeric() %>% order(decreasing = T) 
newlev <- levels(dfm$Var1)[ind] 
dfm$Var1 <- factor(dfm$Var1, levels = newlev) 
library(grid) 
g.mid<-ggplot(dfm,aes(x=1,y=Var1))+geom_text(aes(label=Var1))+ 
    geom_segment(aes(x=0.94,xend=0.96,yend=Var1))+ 
    geom_segment(aes(x=1.04,xend=1.065,yend=Var1))+ 
    ggtitle("")+ 
    ylab(NULL)+ 
    scale_x_continuous(expand=c(0,0),limits=c(0.94,1.065))+ 
    theme(axis.title=element_blank(), 
     panel.grid=element_blank(), 
     axis.text.y=element_blank(), 
     axis.ticks.y=element_blank(), 
     panel.background=element_blank(), 
     axis.text.x=element_text(color=NA), 
     axis.ticks.x=element_line(color=NA), 
     plot.margin = unit(c(1,-1,1,-1), "mm")) 
g1 <- ggplot(data = dfm, aes(x = Var1, y = Freq.x)) + 
    geom_bar(stat = "identity") + ggtitle("Number of sales staff") + 
    geom_point(aes(x = Var1, y = Freq.x),shape=19,size=6,color="red")+ 
    theme(axis.title.x = element_blank(), 
     axis.title.y = element_blank(), 
     axis.text.y = element_blank(), 
     axis.ticks.y = element_blank(), 
     plot.margin = unit(c(1,-1,1,0), "mm")) + 
    scale_y_reverse() + coord_flip() 
g2 <- ggplot(data = dfm, aes(x = Var1, y = Freq.y)) +xlab(NULL)+ 
    geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") + 
    geom_point(aes(x = Var1, y = Freq.y),shape=19,size=6,color="blue")+ 
    theme(axis.title.x = element_blank(), axis.title.y = element_blank(), 
     axis.text.y = element_blank(), axis.ticks.y = element_blank(), 
     plot.margin = unit(c(1,0,1,-1), "mm")) + 
    coord_flip() 
library(gridExtra) 
gg1 <- ggplot_gtable(ggplot_build(g1)) 
gg2 <- ggplot_gtable(ggplot_build(g2)) 
gg.mid <- ggplot_gtable(ggplot_build(g.mid)) 

grid.arrange(gg1,gg.mid,gg2,ncol=3,widths=c(4/9,1/9,4/9)) 

enter image description here

UPDATE Nº4

In diesem Beispiel habe ich die Etiketten ändern.Versuchen Sie diesen Code:

library(ggplot2) 
library(dplyr) 
ind <- gsub("F", "", dfm$Var1) %>% as.numeric() %>% order(decreasing = T) 
newlev <- levels(dfm$Var1)[ind] 
dfm$Var1 <- factor(dfm$Var1, levels = newlev) 
#labeling 35 levels to 7 levels 
library(plyr) 
each5<-levels(dfm$Var1) 
interval<-rep(c(rep(c(FALSE),each=4),TRUE),length.out= 35) 
dfm$Var2<-c("") 
for (i in 1:length(dfm$Var1)){ 
    if (dfm$Var1[i] %in% each5[interval]) 
     dfm$Var2[i]<-as.character(dfm$Var1[i]) 
} 
library(grid) 
g.mid<-ggplot(dfm,aes(x=1,y=Var1))+ 
    geom_text(aes(label= Var2),fontface=2)+ 
    geom_segment(aes(x=0.94,xend=0.96,yend=Var1))+ 
    geom_segment(aes(x=1.04,xend=1.065,yend=Var1))+ 
    ggtitle("")+ 
    ylab(NULL)+ 
    scale_x_continuous(expand=c(0,0),limits=c(0.94,1.065))+ 
    scale_y_discrete(labels=c("F2" = "Dose 0.5", "F10" = "Dose 1", 
          "F21" = "Dose 2"))+ 
    theme(axis.title=element_blank(), 
     panel.grid=element_blank(), 
     axis.text.y=element_blank(), 
     axis.ticks.y=element_blank(), 
     panel.background=element_blank(), 
     axis.text.x=element_text(color=NA), 
     axis.ticks.x=element_line(color=NA), 
     plot.margin = unit(c(1,-1,1,-1), "mm")) 
g1 <- ggplot(data = dfm, aes(x = Var1, y = Freq.x)) + 
    geom_bar(stat = "identity") + ggtitle("Number of sales staff") + 
    geom_point(aes(x = Var1, y = Freq.x),shape=19,size=6,color="red")+ 
    expand_limits(y =600) + 
    theme(axis.title.x = element_blank(), 
     axis.title.y = element_blank(), 
     axis.text.y = element_blank(), 
     axis.ticks.y = element_blank(), 
     plot.margin = unit(c(1,-1,1,0), "mm")) + 
    scale_y_reverse() + coord_flip() 
g2 <- ggplot(data = dfm, aes(x = Var1, y = Freq.y)) +xlab(NULL)+ 
    geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") + 
    geom_point(aes(x = Var1, y = Freq.y),shape=19,size=6,color="blue")+ 
    expand_limits(y =600) + 
    theme(axis.title.x = element_blank(), axis.title.y = element_blank(), 
     axis.text.y = element_blank(), axis.ticks.y = element_blank(), 
     plot.margin = unit(c(1,0,1,-1), "mm")) + 
    coord_flip() 
library(gridExtra) 
gg1 <- ggplot_gtable(ggplot_build(g1)) 
gg2 <- ggplot_gtable(ggplot_build(g2)) 
gg.mid <- ggplot_gtable(ggplot_build(g.mid)) 

grid.arrange(gg1,gg.mid,gg2,ncol=3,widths=c(4/9,1/9,4/9)) 

enter image description here

+0

Ich aktualisiere die Antwort ... – derive111

+0

Hast du ein Beispiel? – derive111

+0

Die gleiche Skala der X-Achse für die rechte und die linke Seite? – derive111

2

Blick unter levels(dfm$Var1). Es verursacht dein Problem. Sie müssen die Reihenfolge ändern. (Ich habe nicht eine gute Idee, über Ellipsen haben.)

library(dplyr) 

ind <- gsub("F", "", dfm$Var1) %>% as.numeric() %>% order(decreasing = T) 
newlev <- levels(dfm$Var1)[ind] 
dfm$Var1 <- factor(dfm$Var1, levels = newlev) 

enter image description here

Verwandte Themen