कैसे ggplot में पहलू अनुपात को ठीक करने के लिए?


89

मैं अपने दस्तावेज़ में फिट होने के लिए एक प्लॉट का आकार बदलने की कोशिश कर रहा हूं, लेकिन मुझे प्लॉट आरेख को एक वर्ग बनाने में कठिनाई हो रही है।

उदाहरण:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

यद्यपि x और y की सीमाएँ समान हैं, परिणाम में प्लॉट वर्गाकार नहीं है। मुझे लगता है कि आर एन्कोडिंग पैनल 5x5 बनाता है "लेकिन वास्तविक आरेख आकार के बारे में परवाह नहीं करता है।

मैं अपने आरेखों को कैसे अनसुना कर सकता हूं ?

जवाबों:


115

में ggplotतंत्र अपने साजिश के पहलू अनुपात बनाए रखने के लिए एक जोड़ने के लिए है coord_fixed()साजिश को परत। यह वास्तविक बाउंडिंग बॉक्स के आकार की परवाह किए बिना, प्लॉट के पहलू अनुपात को संरक्षित करेगा।

(मैं यह भी सुझाव देता हूं कि आप अनुक्रम के ggsaveबजाय अपने परिणामी प्लॉट को pdf / png / etc को बचाने के लिए उपयोग करें pdf(); print(p); dev.off()।)

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

यहाँ छवि विवरण दर्ज करें


3
क्या आप जानते हैं कि ggplot y अक्ष लेबल को बाईं ओर लगाने पर जोर क्यों देता है? मुझे यह जानकर अच्छा लगेगा कि इसे कैसे रोका जाए ...
चेस

@ चेस एक कीचड़ वर्कअराउंड hjustशीर्षक की स्थिति को संशोधित करने के लिए है - प्रयास करें opts(axis.title.y=theme_text(hjust=10))। लेकिन, दुख की बात है कि ऐसा नहीं है। एक ggplot मेलिंग सूची चर्चा और @ बैपटिस्ट के उत्तर के लिए group.google.com/group/ggplot2/browse_thread/thread/… देखें ।
एंड्री

3
वह व्यवहार विकास संस्करण में तय किया गया है।
हैडली

5
प्रश्न के अधिक सामान्य शीर्षक के साथ, क्या आप शायद इस बात की जानकारी भी जोड़ सकते हैं कि दिए गए अनुपात (निर्देशांक_ के लिए तर्क) की गणना कैसे की जाती है, जो दोनों अक्ष पर समान सीमाओं का उपयोग नहीं करता है?
htorque

1
इसके अलावा @ htorque की टिप्पणी; यदि y को इसके बजाय परिभाषित किया जाता है, y=runif(100, 0, 50)तो भूखंड का पहलू अब वर्ग नहीं है। coord_fixed()प्रत्येक धुरी का पैमाना केवल समान लगता है?
एक अलग बेन

80

एक विशेष पहलू अनुपात सुनिश्चित करने के लिए, जैसे वर्ग के लिए, उपयोग करें theme(aspect.ratio=1)

एंड्री का जवाब पूरी तस्वीर नहीं देता है, क्योंकि उदाहरण शायद अप्राकृतिक डेटा प्रदान करता है जहां x की श्रेणी y की सीमा के बराबर होती है। यदि फिर भी डेटा थे:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

तब प्लॉट इस तरह दिखेगा:

यहाँ छवि विवरण दर्ज करें

तार के अनुपात को समायोजित करने के लिए ord_fixed () फ़ंक्शन का भी तर्क है:

ratio पहलू अनुपात, y / x के रूप में व्यक्त किया गया

ताकि प्लॉट को चौकोर बनाया जा सके:

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

यहाँ छवि विवरण दर्ज करें

लेकिन आपको इसे चर या भूखंड क्षेत्र की सीमा के साथ समायोजित करने की आवश्यकता है (सभी सीमाएं इन उदाहरणों की तरह पूरी संख्या से विभाज्य नहीं हैं)।


13

पूर्णता के लिए: यदि आप खाते में बहुत अलग अक्ष सीमाएँ लेना चाहते हैं:

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

जिसके परिणामस्वरूप:


14
यह कैसे से बेहतर है plot + theme(aspect.ratio=4/3)? Ggplot में कई परतें हो सकती हैं, जिसमें कई डेटा सेट होते हैं, और अक्षों में मनमाने ढंग से विस्तार कारक हो सकते हैं, इसलिए एक डेटा स्रोत से y / x के अनुपात की गणना करना काफी नाजुक लगता है।
बपतिस्मा देने वाला

2
क्योंकि यह स्पष्ट रूप से आसानी से खोजे जाने योग्य नहीं है। जो इस तथ्य से सिद्ध होता है कि यहाँ तीन उत्तर हैं, लेकिन कोई भी इसका उल्लेख नहीं करता है। आपको इसे एक उत्तर में रखना चाहिए, यह निश्चित रूप से बेहतर समाधान है।
ग्रिफ़र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.