2012-07-05 12 views
9

के बीच अंतर भी है, इसलिए मैं एक चर के लिए मैप किए गए बार चौड़ाई के साथ एक स्टैक्ड बार ग्राफ़ बनाने की कोशिश कर रहा हूं; लेकिन मैं अपने सलाखों के बीच अंतर स्थिर होना चाहता हूं।ggplot2 में बार ग्राफ़ एक चर के रूप में चौड़ाई के साथ और बार

क्या कोई जानता है कि सलाखों के बीच अंतर को स्थिर कैसे बनाया जाए?

अभी मैं इस मिल गया है:

p<-ggplot(dd, aes(variable, value.y, fill=Date, width=value.x/15))+ coord_flip() + opts(ylab="") 

p1<-p+ geom_bar(stat="identity") + scale_fill_brewer(palette="Dark2") + scale_fill_hue(l=55,c=55) 

p2<-p1 + opts(axis.title.x = theme_blank(), axis.title.y = theme_blank()) 

p2 

enter image description here

अग्रिम धन्यवाद।

यहाँ (लंबी, भारी dput के लिए खेद है) जिस तरह से अपने डेटा है:

> dput(dd) 
structure(list(variable = structure(c(1L, 1L, 1L, 1L, 1L, 3L, 
3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 7L, 7L, 7L, 7L, 7L, 2L, 2L, 
2L, 2L, 2L, 6L, 6L, 6L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 9L, 9L, 9L, 
9L, 9L, 8L, 8L, 8L, 8L, 8L), .Label = c("Alcohol and Tobacco", 
"Health and Personal Care", "Clothing", "Energy", "Recreation and Education", 
"Household", "Food", "Transportation", "Shelter"), class = "factor", scores = structure(c(2.91, 
5.31, 10.08, 15.99, 4.95, 11.55, 11.2, 27.49, 20.6), .Dim = 9L, .Dimnames = list(
    c("Alcohol and Tobacco", "Clothing", "Energy", "Food", "Health and Personal Care", 
    "Household", "Recreation and Education", "Shelter", "Transportation" 
    )))), value.x = c(2.91, 2.91, 2.91, 2.91, 2.91, 5.31, 5.31, 
5.31, 5.31, 5.31, 10.08, 10.08, 10.08, 10.08, 10.08, 15.99, 15.99, 
15.99, 15.99, 15.99, 4.95, 4.95, 4.95, 4.95, 4.95, 11.55, 11.55, 
11.55, 11.55, 11.55, 11.2, 11.2, 11.2, 11.2, 11.2, 27.49, 27.49, 
27.49, 27.49, 27.49, 20.6, 20.6, 20.6, 20.6, 20.6), Date = structure(c(5L, 
4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 
3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 
2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L), .Label = c("1993-2001", 
"2001-2006", "2007-2010", "2010-2011", "2012 Jan - May"), class = "factor"), 
    value.y = c(2.1, 2.5, 7.6, 21.7, 2.8, 1.5, 0.3, -4.1, -4.2, 
    4.7, 3, 16.9, 1.9, 32.8, 23.9, 3.2, 4.6, 11.3, 8.9, 12.9, 
    1.7, 2, 7.8, 5.9, 10, 1.9, 2.1, 5.6, 2.2, 9.9, 1.4, 1.3, 
    2.2, 0.6, 17.3, 1.1, 2.3, 6.4, 13.1, 10, 4.3, 7.6, 0.9, 15.2, 
    20.5)), .Names = c("variable", "value.x", "Date", "value.y" 
), row.names = c(NA, -45L), class = "data.frame") 
+0

के साथ किया गया है आप + facet_grid (~ दिनांक) का उपयोग करने पर विचार करना चाह सकते हैं। यह एक बहुत अधिक पठनीय ग्राफ के लिए बनाता है। –

उत्तर

4

प्रयास # 2.

मैं स्पष्ट रूप में एक निरंतर पैमाने लेखन में ggplot2 को धोखा देना कर रहा हूँ।

# The numbers for tmp I calculated by hand. Not sure how to program 
# this part but the math is 
# last + half(previous_width) + half(current_width) 
# Change the 1st number in cumsum to adjust the between category width 

tmp <- c(2.91,7.02,14.715,27.75,38.22,46.47,57.845,77.19,101.235) + cumsum(rep(5,9))

dd$x.pos1 <- rep(tmp,each=5) 
ggplot(dd,aes(x=x.pos1,y=value.y,fill=Date)) + 
geom_bar(aes(width=value.x),stat="identity",position="stack") + 
scale_x_continuous(breaks=tmp,labels=levels(dd$variable)) + 
coord_flip() 

enter image description here

अच्छा उपाय के लिए आप शायद पाठ का आकार समायोजित करना चाहते हैं जा रहे हैं। यह ... + opts(axis.text.y=theme_text(size=12))

8

एक स्पष्ट या "असतत" पैमाने के लिए - आप चौड़ाई समायोजित कर सकते हैं, लेकिन यह 0 और के बीच होना चाहिए 1. आपका value.x इसे 1 से अधिक रखता है, इसलिए ओवरलैप। आप इष्टतम "दृश्य के लिए rescaling के साथ जल्दी से इस समायोजित करने के लिए इतना है कि बार की चौड़ाई श्रेणी के भीतर कुछ अन्य चर का प्रतिनिधित्व करता है (इस मामले value.x में)

install.packages("scales") 
library(scales) 
ggplot(dd,aes(x=variable,y=value.y,fill=Date)) + 
geom_bar(aes(width=rescale(value.x,c(0.5,1))),stat="identity",position="stack")' + 
coord_flip() 

प्ले तराजू संकुल से, rescale उपयोग कर सकते हैं "0.25 करने के लिए 0,5

enter image description here

व्यक्तिगत रूप से बदल ... आदि, मुझे लगता है कि कुछ इस तरह अधिक सूचनात्मक है:

ggplot(dd,aes(x=variable,y=value.y,fill=Date)) + 
geom_bar(aes(width=rescale(value.x,c(0.2,1))),stat="identity") + 
coord_flip() + facet_grid(~Date) + opts(legend.position="none") 

enter image description here

+0

उत्तर के लिए धन्यवाद, लेकिन मैं वास्तव में सलाखों की चौड़ाई को समायोजित करके ओवरलैप को रोकने की कोशिश नहीं कर रहा हूं (मुझे दृष्टि से प्रभावी होने के लिए बड़ी चौड़ाई अंतर की आवश्यकता है), मैं राशि को बल देना चाहता हूं बार के बीच खाली जगह स्थिर होने के लिए। क्या यह किया जा सकता है? – user1443010

+0

यह भी देखें कि कैसे कुछ स्थितियों में पहलू ग्रिड बेहतर विकल्प होगा, लेकिन इस स्थिति में वर्षों में मूल्य अंतिम मूल्य में समाप्त हो जाता है, इसलिए मेरे उद्देश्यों के लिए मूल प्रारूप अच्छा है। – user1443010

+0

स्पष्ट चर के लिए, मुझे विश्वास नहीं है कि पैमाने के प्रत्येक तत्व के लिए चौड़ाई को समायोजित करने का एक तरीका है। हालांकि, 0.91 में scale_x_discrete() में कुछ समायोजन हुए हैं, इसलिए शायद आपके प्रश्न ggplot2 मेलिंग सूची पर बेहतर उत्तर दिया जाएगा। सर्वोत्तम दृश्य के संबंध में, शायद, प्रत्येक बार पर एक लेबल डालना उपयोगी होगा यदि आप उन्हें एक साथ रखने जा रहे हैं लेकिन फिर भी श्रेणियों के बीच तुलना करना चाहते हैं। –

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