2017-02-08 10 views
5

ggplot2 में पक्ष अनुपात बनाए रखने, coord_fixed() समन्वय प्रणाली है कि डाटा का पहलू अनुपात एक दिया मूल्य पर बनाए रखा है सुनिश्चित करता है। इसलिए, डेटा के आकार को बनाए रखने के लिए पैनल का आकार बदल जाता है। इस बीच coord_flip() साजिश के अक्षों को स्वैप करता है। हालांकि, ggplot2 में एक साजिश में एक समन्वय प्रणाली होनी चाहिए, इसलिए इन कार्यों को संयुक्त नहीं किया जा सकता है।ggplot2: कुल्हाड़ियों फ्लिप और डेटा

मेरा प्रश्न है:

वहाँ coord_fixed() और coord_flip() के व्यवहार संयोजित करने का उपाय मौजूद है, साथ x और y अक्ष एक समन्वय प्रणाली में जिसके परिणामस्वरूप का आदान-प्रदान और डेटा की एक निश्चित पहलू अनुपात?

यह एक लोकप्रिय सवाल है, तथापि आम उत्तर गलत है है:

सामान्यतः सुझाव दिया जवाब theme(aspect.ratio = 1) बजाय coord_fixed() के साथ एक साथ coord_flip() उपयोग करने के लिए है । हालांकि, ggplot2 दस्तावेज़ीकरण के अनुसार, यह सेटिंग "पैनल के पहलू अनुपात" को संदर्भित करती है। इस प्रकार, पैनल के आकार को बनाए रखने के लिए डेटा आकार बदल जाएगा।

मुझे लगता है कि यह एक विशेषता यह है कि वर्तमान में ggplot2 में मौजूद नहीं है है। लेकिन अधिक महत्वपूर्ण बात यह है कि मुझे लगता है कि एक सही समाधान या इस प्रश्न के कम से कम प्रतिक्रिया दस्तावेज किया जाना चाहिए।

मुद्दे के त्वरित न्यूनतम उदाहरण:

library(ggplot2) 
x <- 1:100; data <- data.frame(x = x, y = x * 2) 
p <- ggplot(data, aes(x, y)) + geom_point() 

p # by default panel and data both fit to device window 
p + coord_fixed() # panel changes shape to maintain shape of data 
p + theme(aspect.ratio = 1) # data changes shape to maintain shape of panel 
p + coord_fixed() + coord_flip() # coord_flip() overwrites coord_fixed() 

# popular suggested answer does not maintain aspect ratio of data: 
p + coord_flip() + theme(aspect.ratio = 1) 

उत्तर

3

मैं मानता हूँ कि theme समाधान वास्तव में एक उचित एक नहीं है। यहाँ एक समाधान भूखंड वस्तु में संग्रहीत वास्तविक कुल्हाड़ियों पर्वतमाला से पहलू की गणना के द्वारा प्रोग्राम के काम करता है कि है, लेकिन यह कोड की कुछ लाइनें लेता है:

ranges <- ggplot_build(p)$layout$panel_ranges[[1]][c('x.range', 'y.range')] 
sizes <- sapply(ranges, diff) 
aspect <- sizes[1]/sizes[2] 

p + coord_flip() + theme(aspect.ratio = aspect) 

enter image description here

समाधान मैं शायद का प्रयोग करेंगे व्यावहारिक रूप से, ggstance पैकेज में क्षैतिज भूगर्भ का उपयोग करना है (हालांकि यह हमेशा संभव नहीं हो सकता है)।

नोट: यह केवल एक समान गुणक extend तर्क (अर्थात डिफ़ॉल्ट) के साथ दो निरंतर तराजू के लिए सटीक सही जवाब दे देंगे।

+0

चीयर्स, मुझे लगता है कि समाधान सबसे अच्छा फ़िलहाल मौजूद है। (लेकिन अपने पहले वाक्य के बारे में - 'theme' समाधान सिर्फ गलत है, कोई योग्यता आवश्यक है मैं स्थानिक डेटा को देख रहा हूँ और यह जानने के लिए कि डेटा अपने असली रूप में दिखाया जा रहा है के लिए महत्वपूर्ण है' theme' समाधान कर सकते हैं।। विपरीत प्रभाव – mb7744

+0

@ mb7744 मैं केवल तथ्य यह है कि _many_ लोग (लेकिन निश्चित रूप से सभी नहीं) के लिए मूल समाधान ठीक है की चर्चा करते हुए किया गया था और आगे डेटा बिगाड़ना।)। मैं आपसे असहमत नहीं हूं (यही कारण है कि मैंने सवाल का जवाब दिया)। – Axeman

+0

ज़रूर --- लेकिन क्या मैं हो रही है कि है कि यह केवल लोगों की है कि अंतर नोटिस नहीं है, और उनकी साजिश का गलत मतलब निकालने के लिए ठीक हो सकता है। मुझे लगता है कि इस कारण एसओ पर इस बारे में पिछले दो प्रश्नों में गलत स्वीकृत उत्तर हैं। लेकिन यह सिर्फ मुझे नाइटपिकिंग है। मैं आपके समाधान की सराहना करता हूं! – mb7744