Ggplot का उपयोग करके प्लॉट बनाते समय क्या अन्याय और अन्याय करते हैं?


159

हर बार जब मैं ggplot का उपयोग करके एक प्लॉट बनाता हूं, तो मैं एक लाइन में hjust और vjust के लिए विभिन्न मूल्यों की कोशिश करते हुए थोड़ा समय बिताता हूं जैसे

+ opts(axis.text.x = theme_text(hjust = 0.5))

अक्ष लेबल प्राप्त करने के लिए जहां अक्ष लेबल लगभग अक्ष को छूते हैं, और इसके विरुद्ध फ्लश होते हैं (अक्ष के लिए उचित है, इसलिए बोलने के लिए)। हालाँकि, मुझे वास्तव में समझ नहीं आ रहा है कि क्या हो रहा है। अक्सर, उदाहरण के लिए, hjust = 0.5नाटकीय रूप से अलग-अलग परिणाम देता है hjust = 0.6, कि मैं अलग-अलग मूल्यों के साथ खेलकर इसे समझ नहीं पा रहा हूं।

क्या कोई मुझे व्यापक व्याख्या के लिए इंगित कर सकता है कि अन्याय और अन्यायपूर्ण विकल्प कैसे काम करते हैं?


1
मैंने पहले उत्तर के लिए टिप्पणियों में एक विशिष्ट उदाहरण दिया। जाहिर तौर पर 0-1 के बाहर की संख्या का उपयोग करना अपरिभाषित है, जो यह नहीं समझा रहा है कि क्यों अन्याय = -1 में विचित्र व्यवहार है, कम से कम बताते हैं कि विचित्र की उम्मीद की जानी है।
विलियम गुन 19

जवाबों:


277

का मान hjustऔर vjustकेवल 0 और 1 के बीच परिभाषित कर रहे हैं:

  • ० का अर्थ है, वाम-औचित्य
  • 1 का मतलब सही-सही है

स्रोत: ggplot2, हेडली विकम, पृष्ठ 196

(हां, मुझे पता है कि ज्यादातर मामलों में आप इसे इस सीमा से परे उपयोग कर सकते हैं, लेकिन किसी भी विशिष्ट तरीके से व्यवहार करने की अपेक्षा नहीं करते। यह कल्पना के बाहर है।)

hjustक्षैतिज औचित्य को vjustनियंत्रित करता है और ऊर्ध्वाधर औचित्य को नियंत्रित करता है।

एक उदाहरण यह स्पष्ट करना चाहिए:

td <- expand.grid(
    hjust=c(0, 0.5, 1),
    vjust=c(0, 0.5, 1),
    angle=c(0, 45, 90),
    text="text"
)

ggplot(td, aes(x=hjust, y=vjust)) + 
    geom_point() +
    geom_text(aes(label=text, angle=angle, hjust=hjust, vjust=vjust)) + 
    facet_grid(~angle) +
    scale_x_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2)) +
    scale_y_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2))

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


यह समझने के लिए कि जब आप hjustअक्ष पाठ में परिवर्तन करते हैं , तो आपको यह समझने की आवश्यकता है कि अक्ष पाठ के लिए क्षैतिज संरेखण एक्स-अक्ष के संबंध में नहीं, बल्कि पूरे भूखंड (जहां इसमें y- अक्ष पाठ शामिल है) के संबंध में परिभाषित किया गया है। (यह, मेरे विचार में, दुर्भाग्यपूर्ण है। यह धुरी के सापेक्ष संरेखण के लिए बहुत अधिक उपयोगी होगा।)

DF <- data.frame(x=LETTERS[1:3],y=1:3)
p <- ggplot(DF, aes(x,y)) + geom_point() + 
    ylab("Very long label for y") +
    theme(axis.title.y=element_text(angle=0))


p1 <- p + theme(axis.title.x=element_text(hjust=0)) + xlab("X-axis at hjust=0")
p2 <- p + theme(axis.title.x=element_text(hjust=0.5)) + xlab("X-axis at hjust=0.5")
p3 <- p + theme(axis.title.x=element_text(hjust=1)) + xlab("X-axis at hjust=1")

library(ggExtra)
align.plots(p1, p2, p3)

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


vjustअक्ष लेबल के परिवर्तन के साथ क्या होता है यह जानने के लिए :

DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p1 <- p + theme(axis.text.x=element_text(vjust=0, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0")
p2 <- p + theme(axis.text.x=element_text(vjust=0.5, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0.5")
p3 <- p + theme(axis.text.x=element_text(vjust=1, colour="red")) + 
        xlab("X-axis labels aligned with vjust=1")


library(ggExtra)
align.plots(p1, p2, p3)

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


1
इसलिए कोण = 45 के मामले में, जब मेरे पास अलग-अलग लंबाई के अक्ष लेबल होते हैं, तो 25 से 5 वर्णों से कहते हैं, वे न तो शब्द सीमाओं के दाईं ओर या बाईं ओर संरेखित हैं। यहां कुल्हाड़ियों पर एक नज़र डालें यदि मुझे कोण = 45 का उपयोग करना था, तो मैं उन्हें धुरी के खिलाफ सही-न्यायपूर्ण और फ्लश कैसे बनाऊंगा?
विलियम गुन

मैंने कोशिश की है कि, और मैं और अधिक के Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)लिए मिलता है vjust = .72
विलियम गन

1
@WilliamGunn मेरा सुझाव है कि आप अपने कोड के साथ एक नया प्रश्न पोस्ट करें।
एंड्री सेप

1
चूँकि ऑप्ट अप्रेक्टेड है, हम अक्ष शीर्षक की स्थिति को कैसे समायोजित करते हैं?
साइरस मोहम्मदियन

1
@ साइरसमोहम्मदियन, मैंने वर्तमान ggplot2 सिंटैक्स के साथ काम करने के लिए इस उत्तर को संपादित किया है।
Droplet

16

संभवतः ggplot2 पुस्तक का सबसे निश्चित चित्र B.1 (d) है, जिसके परिशिष्ट http://ggplot2.org/book/appendices.pdf पर उपलब्ध हैं ।

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

हालांकि, यह इतना आसान नहीं है। hjustऔर vjustके रूप में वर्णित है कि यह कैसे काम करता है देखते हैं geom_textऔर theme_text(कभी कभी)। इसके बारे में सोचने का एक तरीका पाठ के चारों ओर एक बॉक्स के बारे में सोचना है, और जहां संदर्भ बिंदु उस बॉक्स के संबंध में है, बॉक्स के आकार के सापेक्ष इकाइयां (और इस प्रकार विभिन्न आकार के ग्रंथों के लिए अलग)। एक hjust0.5 की और एक vjust0.5 केंद्र संदर्भ बिंदु में बॉक्स की। कम करने hjustसे बॉक्स की चौड़ाई समय के अनुसार बॉक्स को दाईं ओर ले जाती है 0.5-hjust। इस प्रकार जब hjust=0, बॉक्स का बायाँ छोर संदर्भ बिंदु पर होता है। hjustबॉक्स की चौड़ाई समय के अनुसार बॉक्स को छोड़ना बढ़ता है hjust-0.5। कबhjust=1, बॉक्स को केंद्र से छोड़ा गया आधा बॉक्स चौड़ाई में स्थानांतरित किया जाता है, जो संदर्भ बिंदु पर सही किनारा डालता है। यदि hjust=2, बॉक्स का दायाँ छोर संदर्भ बिंदु के बाईं ओर स्थित एक बॉक्स चौड़ाई है (केंद्र 2-0.5=1.5संदर्भ की बाईं बॉक्स चौड़ाई है। ऊर्ध्वाधर के लिए, कम ऊपर है और अधिक नीचे है। यह प्रभावी रूप से है कि चित्र B.1 (d) ) कहता है, लेकिन यह [0,1] से परे है।

लेकिन, कभी-कभी यह काम नहीं करता है। उदाहरण के लिए

DF <- data.frame(x=c("a","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p + opts(axis.text.x=theme_text(vjust=0))
p + opts(axis.text.x=theme_text(vjust=1))
p + opts(axis.text.x=theme_text(vjust=2))

तीन बाद वाले भूखंड समान हैं। मुझे नहीं पता कि ऐसा क्यों है। इसके अलावा, यदि पाठ को घुमाया जाता है, तो यह अधिक जटिल है। विचार करें

p + opts(axis.text.x=theme_text(hjust=0, angle=90))
p + opts(axis.text.x=theme_text(hjust=0.5 angle=90))
p + opts(axis.text.x=theme_text(hjust=1, angle=90))
p + opts(axis.text.x=theme_text(hjust=2, angle=90))

पहले में लेबल्स को उचित (नीचे के विपरीत) छोड़ दिया गया है, दूसरे ने उन्हें किसी बॉक्स में केंद्रित किया है, ताकि उनके केंद्र ऊपर पंक्तिबद्ध हो जाएं, और तीसरे ने उन्हें सही ठहराया है (इसलिए उनके दाएं पक्ष अक्ष के बगल में पंक्तिबद्ध होते हैं)। पिछले एक, ठीक है, मैं एक सुसंगत तरीके से समझा नहीं सकता। इसका पाठ के आकार, व्यापक पाठ के आकार के साथ कुछ करना है, और मुझे यकीन नहीं है कि और क्या है।


इसके लिए बहुत बहुत धन्यवाद, यह उस मामले के लिए मदद करता है जहां कोण = 90 है, लेकिन जो मुझे नहीं मिलता है वह यह है कि लेबल का सही-औचित्य तब काम नहीं करता है जब कोण = 90 के बजाय, मैं कोण = 45 का उपयोग करता हूं। मैं कोण = 45, hjust = 0 के व्यवहार को समझता हूं, लेकिन कोण = 45, hjust = -1 केवल विचित्र है।
विलियम गन

आपका पहला उदाहरण, वास्तव में, काम करता है। आपके विचार से यह काम नहीं करता है क्योंकि आपके सभी लेबलों की ऊंचाई समान है। इसके साथ फिर से कोशिश करें DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)- अर्थात किसी \nएक शीर्षक में एक लाइनब्रेक के साथ ।
एंड्री

@William, मुझे लगता है कि @Andrie के पास यह सही है; hjustऔर vjustकेवल 0 और 1 के बीच परिभाषित किए गए हैं; उस सीमा से बाहर के व्यवहार से कोई मतलब नहीं है।
ब्रायन डिग्स

@ और, तुम सही हो। लेकिन मुझे अभी भी एक कठिन समय है धुरी शीर्षक / पाठ मामले में एक सुसंगत मानसिक मॉडल बनाने का। अक्ष पाठ के लिए, hjust=0टिक के साथ बाएं किनारे को संरेखित करें; hjust=0.5टिक पर केंद्र; hjust=1टिक के साथ दाहिने किनारे को संरेखित करता है (संदर्भ बिंदु के सापेक्ष चलती बॉक्स)। लेकिन एक बॉक्स के भीतर सबसे लंबे लेबल का आकार vjustसंरेखित करता है ।
ब्रायन डिग्स

@BrianDiggs vjustअक्ष लेबल के मामले में , सभी लेबल एक साथ एक दूसरे के साथ संरेखित होते हैं। तो सभी ऊपरी किनारों को संरेखित करते हैं जब vjust=1और इसी तरह नीचे के सभी किनारों को vjust=0। यह मेरे लिए एकदम सही समझ में आता है।
एंड्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.