2013-08-16 4 views
14

मैं एक भूखंड आबादी के समान पर दो चर साजिश करना चाहते हैं इस के समान पिरामिड:दो क्षैतिज बार चार्ट (जनसंख्या पिरामिड के समान)

plot

इस साजिश लगभग है वहां पर काफी कुछ नहीं है, कारणों से मैं नीचे सूचीबद्ध करूंगा।

मैं निम्नलिखित कोड के साथ इस साजिश का उत्पादन: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/

से शब्दशः)

DATA <- data.frame(
    state = c("AK", "TX", "CA", "MT", "NM", "AZ", "NV", "CO", "OR", "WY", "MI", "MN", "UT", "ID", "KS", "NE", "SD", "WA", "ND", "OK"), 
    sales_staff = c(20,30,40,10,15,35,18,25,22,7,12,22,3,4,5,8,14,28,24,32) 
) 

set.seed(1) 
DATA$sales <- DATA$sales_staff * 50 + (runif(nrow(DATA)) * 1000) 

# Order the state factor by number of sales staff so that it is plotted in that order 
DATA$state <- factor(DATA$state, levels = DATA[order(DATA$sales_staff),"state"]) 

मैं "गोंद" दो भूखंडों बैक-टू-बैक, तो मैं multiplot (उपयोग करना चाहते हैं समारोह (

library(ggplot2) 

g1 <- ggplot(data = DATA, aes(x = state, y = sales_staff)) + 
    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,0,1,0), "mm")) + 
    scale_y_reverse() + coord_flip() 

g2 <- ggplot(data = DATA, aes(x = state, y = sales)) + 
    geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") + 
    theme(axis.title.x = element_blank(), axis.title.y = element_blank(), plot.margin = unit(c(1,5,1,0), "mm")) + 
    coord_flip() 

multiplot(g1, g2, cols = 2) 
: मैं यहाँ संक्षिप्तता और स्पष्टता)

अंतिम साजिश के लिए मेरे कोड है के लिए है कि समारोह के लिए कोड पुन: पेश नहीं होंगे

ठीक है। तो इस साजिश में क्या गलत है?

  • मुझे बाएं साजिश के दाएं-अक्ष पर टिक अंक प्राप्त करने की आवश्यकता है। मैं यह नहीं समझ सकता कि यह कैसे करें।
  • दो भूखंड अलग-अलग चौड़ाई हैं। ऐसा इसलिए है क्योंकि बीच के राज्य सही साजिश से अक्ष लेबल हैं और उस साजिश के लिए कुछ जगह का उपयोग करते हैं।

मैंने इस साजिश को "उत्पादन गुणवत्ता" में लाने में ईंट की दीवार मारा है। मुझे आश्चर्य हो रहा है कि क्या मैं गलत तरीके से इस बारे में जा रहा हूं क्योंकि मैं सोच रहा हूं कि अगले चरण अक्ष प्लेटों को दो भूखंडों के बीच एक अलग तीसरे कॉलम के रूप में आकर्षित करना होगा। (मुझे अभी तक यह नहीं पता कि यह कैसे करें)। यह "बराबर आकार" मुद्दा हल करेगा और मुझे "राज्य" शीर्षक जोड़ने की अनुमति देगा, इसलिए यह अभी भी जाने का तरीका हो सकता है। लेकिन मैं बस मदद नहीं कर सकता लेकिन आश्चर्यचकित हूं कि क्या कोई आसान तरीका है ...

कोई सलाह या सहायता की सराहना की!

+1

आप अपने उद्देश्य के लिए http://stackoverflow.com/questions/14680075/simpler-population-pyramid-in-ggplot2?lq=1 समायोजित कर सकते हैं? – mnel

+2

मैं एक मरहार्ड 'ggplot2' प्रशंसक हूं और पूरी तरह से सबकुछ के लिए पैकेज का उपयोग करता हूं, लेकिन जब मुझे कुछ महीने पहले एक जैसा पिरामिड प्लॉट बनाने की ज़रूरत होती है तो मैंने अंततः छोड़ दिया और 'pyramid.plot' का उपयोग किया 'प्लॉट्रिक्स' पैकेज। नहीं, मुझे सिंटैक्स पसंद नहीं आया, लेकिन यह मुश्किल नहीं था और मुझे 'ggplot2' के साथ बेहतर परिणाम मिल गए और बहुत कम गड़बड़ी हुई। – SlowLearner

+0

आपको "बैक टू बैक चार्ट" की खोज करनी चाहिए। –

उत्तर

22

यहां आपकी साजिश के लिए बहुत लंबा कामकाज है। आइडिया नई साजिश तैयार करना है जिसमें दोनों पक्षों पर केवल राज्य के नाम और टिकटें हों और फिर इसे मध्य साजिश के रूप में उपयोग करें।

इस साजिश के लिए मैंने स्पेस को हटाने के लिए स्थान और ylab(NULL) प्राप्त करने के लिए नाम के साथ शीर्षक जोड़ा। अन्य भूखंडों के करीब साजिश पाने के लिए बाएं और दाएं मार्जिन मान -1 के लिए हैं। साजिश मार्जिन के लिए फ़ंक्शन unit() का उपयोग करने की योजना बनाने से पहले लाइब्रेरी grid को जोड़ा जाना चाहिए।

library(grid) 
g.mid<-ggplot(DATA,aes(x=1,y=state))+geom_text(aes(label=state))+ 
    geom_segment(aes(x=0.94,xend=0.96,yend=state))+ 
    geom_segment(aes(x=1.04,xend=1.065,yend=state))+ 
    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")) 

दोनों मूल भूखंड संशोधित किए गए हैं। सबसे पहले, दूसरी साजिश के लिए वाई अक्ष को हटा दिया और बाएं/दाएं मार्जिन -1 को भी बनाया।

g1 <- ggplot(data = DATA, aes(x = state, y = sales_staff)) + 
    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 = DATA, aes(x = state, y = sales)) +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() 

अब भूखंडों में शामिल होने के पुस्तकालय gridExtra और समारोह घ grid.arrange() का उपयोग करें। प्लॉट करने से पहले सभी भूखंडों को grobs के रूप में बनाया जाता है।

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

+2

+1! और स्पष्ट रूप से ओ पी –

+0

कुछ इसी तरह के जवाब देने के लिए प्रसाद ने सुझाव दिया गया है http://stackoverflow.com/questions/4559229/drawing-pyramid-plot-using-r-and-ggplot2 –

+0

@ RomanLuštrik यह बहुत तेजी लेकिन मुझे नहीं है पहले देखा गया :) –

संबंधित मुद्दे