प्रत्येक तरफ और अलग-अलग तराजू पर 2 y कुल्हाड़ियों के साथ ggplot


231

मुझे एक बार चार्ट दिखाने की आवश्यकता है, जो एक चार्ट में सभी को दिखाते हुए दर और एक लाइन चार्ट दिखाते हैं, मैं दोनों को अलग-अलग कर सकता हूं, लेकिन जब मैं उन्हें एक साथ रखता हूं, तो मैं पहली परत (यानी geom_bar) के पैमाने को दूसरे द्वारा ओवरलैप करता हूं परत (यानी geom_line)।

क्या मैं अक्ष geom_lineको दाईं ओर ले जा सकता हूं ?


5
क्या आप यहाँ shwon, rpubs.com/kohske/dual_axis_in_ggplot2 के रूप में एक दृष्टिकोण का उपयोग कर सकते हैं ?
टॉम वेन्सलेर्स


2
वर्तमान में कहे गए मूल ggplot2कार्यान्वयन को देखने के लिए नीचे स्क्रॉल करें । scale_y_*sec.axis
PatrickT

जवाबों:


106

कभी-कभी एक ग्राहक दो y तराजू चाहता है। उन्हें "त्रुटिपूर्ण" भाषण देना अक्सर व्यर्थ लगता है। लेकिन मैं चीजों को सही तरीके से करने के लिए ggplot2 के आग्रह को पसंद करता हूं। मुझे यकीन है कि ggplot वास्तव में उचित दृश्य तकनीकों के बारे में औसत उपयोगकर्ता को शिक्षित कर रहा है।

हो सकता है कि आप दो डेटा श्रृंखलाओं की तुलना करने के लिए फेसिंग और स्केल फ्री का उपयोग कर सकें? - यहाँ देखें: https://github.com/hadley/ggplot2/wiki/Align-two-plots-on-a-page


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

58
एक प्लॉटिंग पैकेज को अपने निजी विचारों को कैसे संचालित करने की आवश्यकता है? नहीं धन्यवाद।
कॉलिन

5
आपकी कड़ी छूट गई। क्या आप अपना उत्तर संपादित कर सकते हैं और इसका सारांश प्रस्तुत कर सकते हैं कि यह क्या कहता था?
ज़च

24
इस टिप्पणी (पुनः शेख़ी) से सहमत नहीं हो सकते। संदेश को जल्दी से लाने के लिए वैज्ञानिक पत्रिकाओं आदि द्वारा लगाए गए कड़े प्रतिबंधों को देखते हुए यह बहुत संभव है कि (जैसे!) संभव हो सके। इसलिए, वैसे भी एक दूसरी y अक्ष को जोड़ा जा रहा है, और ggplot, मेरी राय में, ऐसा करने में मदद करना चाहिए।
स्टिंगरी

57
आश्चर्यजनक है कि "त्रुटिपूर्ण" और "सही तरीके" जैसे निर्विवाद रूप से शब्दों को कैसे फेंक दिया जाता है जैसे कि वे एक सिद्धांत पर आधारित नहीं थे जो कि वास्तव में काफी मतलबी और हठधर्मिता है, लेकिन अब तक बहुत से लोगों द्वारा इसे स्वीकार नहीं किया गया है, जैसा कि देखा जा सकता है तथ्य यह है कि यह पूरी तरह से अनपेक्षित उत्तर (जो एक लिंक-हड्डी फेंकता है) में लेखन के समय 72 उत्थान होते हैं। Whe की तुलना समय श्रृंखला, उदाहरण के लिए, यह एक ही चार्ट पर दोनों के लिए अमूल्य, हो सकता है क्योंकि मतभेदों के सह-संबंध बहुत पहचानना आसान है। बस हजारों उच्च शिक्षित वित्त पेशेवरों से पूछें जो हर दिन पूरे दिन ऐसा करते हैं।
थॉमस ब्राउन

149

यह ggplot2 में संभव नहीं है क्योंकि मेरा मानना ​​है कि अलग-अलग y तराजू के साथ भूखंड हैं (न कि y-तराजू जो एक दूसरे के रूपांतरण हैं) मौलिक रूप से त्रुटिपूर्ण हैं। कुछ समस्याएँ:

  • इन्वर्टिबल नहीं हैं: प्लॉट स्पेस पर एक पॉइंट दिया गया है, आप विशिष्ट रूप से इसे डेटा स्पेस में एक पॉइंट पर मैप नहीं कर सकते हैं।

  • वे अन्य विकल्पों की तुलना में सही ढंग से पढ़ने के लिए अपेक्षाकृत कठिन हैं। विवरण के लिए पेट्रा इसेनबर्ग, अनास्तासिया बेज़ेरियनोस, पियरे ड्रैगिसविक और जीन-डैनियल फ़ेकेट द्वारा डुअल-स्केल डेटा चार्ट पर एक अध्ययन देखें।

  • उन्हें आसानी से गुमराह करने के लिए हेरफेर किया जाता है: कुल्हाड़ियों के सापेक्ष तराजू को निर्दिष्ट करने का कोई अनूठा तरीका नहीं है, जो उन्हें हेरफेर करने के लिए खुला छोड़ देता है। दीवाने ब्लॉग से दो उदाहरण: एक , दो

  • वे मनमानी कर रहे हैं: क्यों केवल 2 तराजू हैं, 3, 4 या दस नहीं?

आप ग्राफ पर ड्यूल-स्केल एक्सिस विषय पर स्टीफन फ्यु की लंबी चर्चा को पढ़ना चाह सकते हैं ?


39
क्या आप अपनी राय विस्तार से बताएंगे? मधुमक्खी प्रबुद्ध नहीं है, मुझे लगता है कि इसके दो स्वतंत्र चर की साजिश रचने का एक कॉम्पैक्ट तरीका है। यह एक ऐसी सुविधा भी है जिसके लिए कहा जाता है, और इसका व्यापक रूप से उपयोग किया जाता है।
१०:३० पर कार्ल १।

66
@ हडले: ज्यादातर मैं सहमत हूं, लेकिन कई y तराजू के लिए एक वास्तविक उपयोग है - एक ही डेटा के लिए 2 अलग-अलग इकाइयों का उपयोग, जैसे, तापमान समय श्रृंखला पर सेल्सियस और फ़ारेनहाइट तराजू।
रिची कॉटन

11
@ हडले आपकी राय में। न मेरा, न अन्य वैज्ञानिकों का। निश्चित रूप से यह पहली बार सीधे दूसरे प्लॉट (पूरी तरह से पारदर्शी पृष्ठभूमि के साथ) डालकर प्राप्त किया जा सकता है, इसलिए वे एक के रूप में दिखाई देते हैं। मैं अभी नहीं जानता कि बाउंडिंग बॉक्सेक्स के कोनों को एक दूसरे के साथ कैसे पंजीकृत / पंजीकृत किया जाए।
निकोलस हैमिल्टन

8
@ हडले उदाहरण के लिए, वाल्थर-लिएथ जलवायु आरेखों में , दो y कुल्हाड़ियों का आमतौर पर उपयोग किया जाता है। चूंकि एक निश्चित नुस्खा है कि कैसे करें कि संभव भ्रम कम से कम हो ...
sebschub

32
@ अहद मुझे खेद है, मैं नहीं देखता कि दिए गए जलवायु आरेख के साथ क्या समस्या है। तापमान और वर्षा को एक आरेख (निश्चित नुस्खे के साथ) में डालकर, एक त्वरित पहला अनुमान लगाता है कि क्या यह आर्द्र या शुष्क जलवायु है। या चारों ओर का रास्ता: तापमान, वर्षा और उनके "संबंध" की कल्पना करने का इससे बेहतर तरीका क्या होगा? वैसे भी, ggplot2 में आपके काम के लिए बहुत बहुत धन्यवाद!
sebschub

121

Ggplot2 2.2.0 से शुरू करके आप इस तरह एक द्वितीयक अक्ष जोड़ सकते हैं ( ggplot2 2.2.0 घोषणा से लिया गया ):

ggplot(mpg, aes(displ, hwy)) + 
  geom_point() + 
  scale_y_continuous(
    "mpg (US)", 
    sec.axis = sec_axis(~ . * 1.20, name = "mpg (UK)")
  )

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


25
नकारात्मक पक्ष यह है, यह केवल वर्तमान कुल्हाड़ियों के कुछ सूत्र परिवर्तन का उपयोग कर सकता है न कि एक नया चर, उदाहरण के लिए।
शिष्य

41

उपरोक्त उत्तर और कुछ ठीक-ट्यूनिंग (और जो भी इसके लायक है) के लिए, यहाँ दो तराजू प्राप्त करने का एक तरीका है sec_axis:

एक साधारण (और विशुद्ध रूप से काल्पनिक) डेटा सेट मान लें dt: पांच दिनों के लिए, यह रुकावट वी.एस. उत्पादकता की संख्या को ट्रैक करता है:

        when numinter prod
1 2018-03-20        1 0.95
2 2018-03-21        5 0.50
3 2018-03-23        4 0.70
4 2018-03-24        3 0.75
5 2018-03-25        4 0.60

(दोनों स्तंभों की श्रेणी कारक 5 के बारे में भिन्न होती है)।

निम्नलिखित कोड दोनों श्रृंखलाओं को आकर्षित करेगा जो वे पूरे y अक्ष का उपयोग करते हैं:

ggplot() + 
  geom_bar(mapping = aes(x = dt$when, y = dt$numinter), stat = "identity", fill = "grey") +
  geom_line(mapping = aes(x = dt$when, y = dt$prod*5), size = 2, color = "blue") + 
  scale_x_date(name = "Day", labels = NULL) +
  scale_y_continuous(name = "Interruptions/day", 
    sec.axis = sec_axis(~./5, name = "Productivity % of best", 
      labels = function(b) { paste0(round(b * 100, 0), "%")})) + 
  theme(
      axis.title.y = element_text(color = "grey"),
      axis.title.y.right = element_text(color = "blue"))

यहाँ परिणाम है (ऊपर कोड + कुछ रंग tweaking):

एक ggplot2 में दो पैमाने

बिंदु (एक तरफ से उपयोग करते sec_axisसमय y_scale को निर्दिष्ट करने से अलग है) श्रृंखला को सूचित करते समय प्रत्येक 2 डेटा श्रृंखला को 5 से गुणा करना है। लेबल को sec_axis परिभाषा में ठीक से प्राप्त करने के लिए, इसे फिर 5 (और स्वरूपण) से विभाजित करने की आवश्यकता है । उपरोक्त कोड में एक महत्वपूर्ण हिस्सा वास्तव *5में geom_line और ~./5sec_axis में है (वर्तमान मूल्य .को 5 से विभाजित करने वाला सूत्र )।

तुलना में (मैं यहां दृष्टिकोणों का न्याय नहीं करना चाहता), यह है कि एक दूसरे के ऊपर दो चार्ट कैसे दिखते हैं:

एक दूसरे से दो चार्ट ऊपर

आप अपने लिए निर्णय ले सकते हैं कि कौन सा संदेश बेहतर ट्रांसपोर्ट करता है ("काम में लोगों को बाधित न करें!")। लगता है कि एक उचित तरीका तय करना है।

दोनों छवियों के लिए पूर्ण कोड (यह वास्तव में ऊपर की तुलना में अधिक नहीं है, बस पूर्ण और चलाने के लिए तैयार है) यहां है: https://gist.github.com/sebastianrothbucher/de847063f32fdff02c83c75f59c36a7d अधिक विस्तृत विवरण यहां देखें: https: // sebastianrothbucher। github.io/datascience/r/visualization/ggplot/2018/03/24/two-scales-ggplot-r.html


31

वहाँ y अक्ष, जैसे, द्वंद्वयुद्ध आम उपयोग-मामलों रहे हैं climatograph मासिक तापमान और वर्षा दिखा। यहाँ एक सरल उपाय है, जो मेगेट्रॉन के समाधान से सामान्यीकृत है जिससे आप चर की निचली सीमा को शून्य से कुछ और सेट कर सकते हैं:

उदाहरण डेटा:

climate <- tibble(
  Month = 1:12,
  Temp = c(-4,-4,0,5,11,15,16,15,11,6,1,-3),
  Precip = c(49,36,47,41,53,65,81,89,90,84,73,55)
  )

निम्नलिखित दो मानों को डेटा की सीमाओं के करीब मानों में सेट करें (आप ग्राफ़ की स्थितियों को समायोजित करने के लिए इन के साथ खेल सकते हैं; कुल्हाड़ियों अभी भी सही हो जाएगा):

ylim.prim <- c(0, 180)   # in this example, precipitation
ylim.sec <- c(-4, 18)    # in this example, temperature

निम्नलिखित इन सीमाओं के आधार पर आवश्यक गणना करता है, और प्लॉट को स्वयं बनाता है:

b <- diff(ylim.prim)/diff(ylim.sec)
a <- b*(ylim.prim[1] - ylim.sec[1])

ggplot(climate, aes(Month, Precip)) +
  geom_col() +
  geom_line(aes(y = a + Temp*b), color = "red") +
  scale_y_continuous("Precipitation", sec.axis = sec_axis(~ (. - a)/b, name = "Temperature")) +
  scale_x_continuous("Month", breaks = 1:12) +
  ggtitle("Climatogram for Oslo (1961-1990)")  

Climatogram लाइन के रूप में तापमान दिखा रहा है और बारप्लॉट के रूप में वर्षा करता है

यदि आप यह सुनिश्चित करना चाहते हैं कि लाल रेखा दाएं हाथ की y अक्ष से मेल खाती है, तो आप themeकोड में एक वाक्य जोड़ सकते हैं :

ggplot(climate, aes(Month, Precip)) +
  geom_col() +
  geom_line(aes(y = a + Temp*b), color = "red") +
  scale_y_continuous("Precipitation", sec.axis = sec_axis(~ (. - a)/b, name = "Temperature")) +
  scale_x_continuous("Month", breaks = 1:12) +
  theme(axis.line.y.right = element_line(color = "red"), 
        axis.ticks.y.right = element_line(color = "red"),
        axis.text.y.right = element_text(color = "red"), 
        axis.title.y.right = element_text(color = "red")
        ) +
  ggtitle("Climatogram for Oslo (1961-1990)")

दाएं हाथ की धुरी का रंग:

लाल दाहिने हाथ की धुरी के साथ क्लाइमेटोग्राम


के कुछ मूल्यों पर यह टूट जाता है ylim.primऔर ylim.sec
एरिक क्रान्टज

5
यह भी खूब रही। दो-अक्ष चार्ट "त्रुटिपूर्ण" नहीं होने पर इसका अच्छा उदाहरण है। सोचने की सामान्य चुस्त मानसिकता का हिस्सा वे आपके काम के बारे में अधिक जानते हैं जो आप करते हैं।
सिंह बार्लच

जब मैं विशिष्ट अक्ष सीमाएँ चुनता हूं (मेरे मामले में ylim.prim <- c (90, 130) और ylim.sec <- c (15, 30)) तो इसे लागू नहीं करता है लेकिन मनमानी सीमा चुनता है, सभी पैमानों को गड़बड़ कर देता है । मुझे यकीन नहीं है कि मैं क्या याद कर रहा हूं क्योंकि मैंने उपरोक्त कोड को कॉपी किया है और बस चर नाम और अक्ष सीमाएं बदल दी हैं
Anke

@anke: जब यह ylim.prim और ylim.sec को संदर्भित करता है तो पाठ कुछ टेढ़ा होता है। वे अक्ष की सीमाओं को संदर्भित नहीं करते हैं, बल्कि आपके डेटा की सीमाओं को देखते हैं। जब आप ylim.prim सेट करते हैं <- c (90, 130) और ylim.sec <- c (15, 30) जैसा कि आप उल्लेख करते हैं, तापमान का ग्राफ बार प्लॉट के ऊपर ऊंचा होता है (जैसे तापमान अक्ष -75 पर शुरू होता है) , लेकिन प्रत्येक ग्राफ के लिए अक्ष अभी भी सही हैं।
डेग हर्मनमैन

16

आप एक स्केलिंग कारक बना सकते हैं जिसे दूसरे जियोम और राइट वाई-एक्सिस पर लागू किया जाता है। यह सेबस्टियन के समाधान से लिया गया है।

library(ggplot2)

scaleFactor <- max(mtcars$cyl) / max(mtcars$hp)

ggplot(mtcars, aes(x=disp)) +
  geom_smooth(aes(y=cyl), method="loess", col="blue") +
  geom_smooth(aes(y=hp * scaleFactor), method="loess", col="red") +
  scale_y_continuous(name="cyl", sec.axis=sec_axis(~./scaleFactor, name="hp")) +
  theme(
    axis.title.y.left=element_text(color="blue"),
    axis.text.y.left=element_text(color="blue"),
    axis.title.y.right=element_text(color="red"),
    axis.text.y.right=element_text(color="red")
  )

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

नोट: v3.0.0 का उपयोग करggplot2


14

इस चुनौती के समाधान के लिए तकनीकी रीढ़ कोहक्स द्वारा कुछ 3 साल पहले प्रदान की गई है [ KOHSKE ]। इसके समाधान के विषय और तकनीकी के बारे में स्टैकओवरफ़्लो [आईडी: 18989001, 29235405, 21026598] पर कई उदाहरणों पर चर्चा की गई है। इसलिए मैं केवल उपरोक्त समाधानों का उपयोग करके एक विशिष्ट भिन्नता और कुछ व्याख्यात्मक पूर्वाभ्यास प्रदान करूंगा।

मान लें कि हमारे पास समूह G1 में कुछ डेटा y1 है , जिसमें समूह G2 में कुछ डेटा y2 किसी तरह से संबंधित है, जैसे श्रेणी / स्केल रूपांतरित या कुछ शोर के साथ जोड़ा गया है। तो एक बाईं ओर y1 और दाईं ओर y2 के पैमाने के साथ एक भूखंड पर डेटा को एक साथ जोड़ना चाहता है ।

  df <- data.frame(item=LETTERS[1:n],  y1=c(-0.8684, 4.2242, -0.3181, 0.5797, -0.4875), y2=c(-5.719, 205.184, 4.781, 41.952, 9.911 )) # made up!

> df
  item      y1         y2
1    A -0.8684 -19.154567
2    B  4.2242 219.092499
3    C -0.3181  18.849686
4    D  0.5797  46.945161
5    E -0.4875  -4.721973

अगर हम अब अपने डेटा को कुछ के साथ मिलकर साजिश करते हैं

ggplot(data=df, aes(label=item)) +
  theme_bw() + 
  geom_segment(aes(x='G1', xend='G2', y=y1, yend=y2), color='grey')+
  geom_text(aes(x='G1', y=y1), color='blue') +
  geom_text(aes(x='G2', y=y2), color='red') +
  theme(legend.position='none', panel.grid=element_blank())

यह छोटे रूप से संरेखित नहीं करता है क्योंकि बड़े पैमाने पर y2 द्वारा छोटे पैमाने y1 obviosuly ढह जाता है ।

चुनौती को पूरा करने के लिए यहां ट्रिक पहले पैमाने y1 के खिलाफ दोनों डेटा सेट को तकनीकी रूप से साजिश करने के लिए है, लेकिन मूल पैमाने पर y2 दिखाने वाले लेबल के साथ एक द्वितीयक अक्ष के खिलाफ दूसरे की रिपोर्ट करें ।

तो हम एक पहला सहायक फ़ंक्शन CalcFudgeAxis का निर्माण करते हैं जो दिखाए जाने वाले नए अक्ष की विशेषताओं की गणना और एकत्र करता है। फ़ंक्शन को पसंद करने वाले अयोन में संशोधन किया जा सकता है (यह सिर्फ y2 को y1 की सीमा पर मैप करता है )।

CalcFudgeAxis = function( y1, y2=y1) {
  Cast2To1 = function(x) ((ylim1[2]-ylim1[1])/(ylim2[2]-ylim2[1])*x) # x gets mapped to range of ylim2
  ylim1 <- c(min(y1),max(y1))
  ylim2 <- c(min(y2),max(y2))    
  yf <- Cast2To1(y2)
  labelsyf <- pretty(y2)  
  return(list(
    yf=yf,
    labels=labelsyf,
    breaks=Cast2To1(labelsyf)
  ))
}

कुछ पैदावार:

> FudgeAxis <- CalcFudgeAxis( df$y1, df$y2 )

> FudgeAxis
$yf
[1] -0.4094344  4.6831656  0.4029175  1.0034664 -0.1009335

$labels
[1] -50   0  50 100 150 200 250

$breaks
[1] -1.068764  0.000000  1.068764  2.137529  3.206293  4.275058  5.343822


> cbind(df, FudgeAxis$yf)
  item      y1         y2 FudgeAxis$yf
1    A -0.8684 -19.154567   -0.4094344
2    B  4.2242 219.092499    4.6831656
3    C -0.3181  18.849686    0.4029175
4    D  0.5797  46.945161    1.0034664
5    E -0.4875  -4.721973   -0.1009335

अब मैंने दूसरे हेल्पर फंक्शन PlotWithFudgeAxis (जिसमें हम ggplot ऑब्जेक्ट और नए एक्सिस की हेल्पर ऑब्जेक्ट को फेंकते हैं) में Kohske के सॉल्यूशन को लपेटा :

library(gtable)
library(grid)

PlotWithFudgeAxis = function( plot1, FudgeAxis) {
  # based on: https://rpubs.com/kohske/dual_axis_in_ggplot2
  plot2 <- plot1 + with(FudgeAxis, scale_y_continuous( breaks=breaks, labels=labels))

  #extract gtable
  g1<-ggplot_gtable(ggplot_build(plot1))
  g2<-ggplot_gtable(ggplot_build(plot2))

  #overlap the panel of the 2nd plot on that of the 1st plot
  pp<-c(subset(g1$layout, name=="panel", se=t:r))
  g<-gtable_add_grob(g1, g2$grobs[[which(g2$layout$name=="panel")]], pp$t, pp$l, pp$b,pp$l)

  ia <- which(g2$layout$name == "axis-l")
  ga <- g2$grobs[[ia]]
  ax <- ga$children[[2]]
  ax$widths <- rev(ax$widths)
  ax$grobs <- rev(ax$grobs)
  ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
  g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1)
  g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)

  grid.draw(g)
}

अब सभी को एक साथ रखा जा सकता है: नीचे दिए गए कोड से पता चलता है कि प्रस्तावित समाधान का उपयोग दिन-प्रतिदिन के वातावरण में कैसे किया जा सकता है । प्लॉट कॉल अब doesn मूल डेटा y2 को प्लॉट करता है लेकिन एक क्लोन संस्करण yf (पूर्व-गणना की गई हेल्पर ऑब्जेक्ट FudgeAxis के अंदर आयोजित ), जो y1 के पैमाने पर चलता है । मूल ggplot objet तो कोह्सके सहायक समारोह PlotWithFudgeAxis के साथ हेरफेर किया गया है y2 के तराजू को संरक्षित करने के लिए एक दूसरी धुरी को जोड़ने के लिए । यह भूखंड के साथ-साथ हेरफेर की साजिश भी है।

FudgeAxis <- CalcFudgeAxis( df$y1, df$y2 )

tmpPlot <- ggplot(data=df, aes(label=item)) +
      theme_bw() + 
      geom_segment(aes(x='G1', xend='G2', y=y1, yend=FudgeAxis$yf), color='grey')+
      geom_text(aes(x='G1', y=y1), color='blue') +
      geom_text(aes(x='G2', y=FudgeAxis$yf), color='red') +
      theme(legend.position='none', panel.grid=element_blank())

PlotWithFudgeAxis(tmpPlot, FudgeAxis)

यह अब दो अक्षों के साथ वांछित है, बाईं ओर y1 और दाईं ओर y2 है

२ अक्ष

ऊपर समाधान है, इसे सीधे रखने के लिए, एक सीमित अस्थिर हैक। जैसा कि यह ggplot कर्नेल के साथ खेलता है यह कुछ चेतावनियों को फेंक देगा जो हम पोस्ट-टू-फैक्ट स्केल आदि का आदान-प्रदान करते हैं, इसे देखभाल के साथ संभालना पड़ता है और दूसरी सेटिंग में कुछ अवांछित व्यवहार उत्पन्न हो सकता है। वांछित के रूप में लेआउट प्राप्त करने के लिए सहायक कार्यों के साथ-साथ किसी को भी फेल करने की आवश्यकता हो सकती है। किंवदंती की नियुक्ति एक ऐसा मुद्दा है (इसे पैनल और नए अक्ष के बीच रखा जाएगा; यही कारण है कि मैंने इसे छोड़ दिया)। 2 अक्ष के स्केलिंग / संरेखण के रूप में अच्छी तरह से थोड़ा चुनौतीपूर्ण है: ऊपर दिए गए कोड अच्छी तरह से काम करते हैं जब दोनों तराजू में "0" होता है, अन्यथा एक अक्ष स्थानांतरित हो जाता है। तो निश्चित रूप से सुधार करने के कुछ अवसरों के साथ ...

मामले में तस्वीर को खुले / बंद में तस्वीर को लपेटने के लिए तस्वीर को सहेजना चाहता है:

png(...)
PlotWithFudgeAxis(tmpPlot, FudgeAxis)
dev.off()

9

निम्नलिखित लेख ने मुझे एक पंक्ति में ggplot2 द्वारा उत्पन्न दो भूखंडों को संयोजित करने में मदद की:

आर के लिए कुकबुक द्वारा एक पृष्ठ (ggplot2) पर कई रेखांकन

और यहाँ कोड इस मामले में कैसा दिख सकता है:

p1 <- 
  ggplot() + aes(mns)+ geom_histogram(aes(y=..density..), binwidth=0.01, colour="black", fill="white") + geom_vline(aes(xintercept=mean(mns, na.rm=T)), color="red", linetype="dashed", size=1) +  geom_density(alpha=.2)

p2 <- 
  ggplot() + aes(mns)+ geom_histogram( binwidth=0.01, colour="black", fill="white") + geom_vline(aes(xintercept=mean(mns, na.rm=T)), color="red", linetype="dashed", size=1)  

multiplot(p1,p2,cols=2)

मल्टीप्लोट फ़ंक्शन का क्या हुआ? मुझे एक त्रुटि मिलती है कि फ़ंक्शन नहीं मिल सका, इस तथ्य के बावजूद कि मेरे पास ggplot2 लाइब्रेरी स्थापित और लोड है।
नेनेका

1
@ डंका मल्टीप्लेट फ़ंक्शन एक कस्टम फ़ंक्शन (लिंक किए गए पृष्ठ के निचले भाग में) है।
ड्रीबेल जुले

क्या आप कथानक जोड़ सकते हैं?
सिबो जियांग

हाल ही में, ऐसे कई पैकेज हैं जिनमें multiplot stackoverflow.com/a/51220506
Tung

7

मेरे लिए मुश्किल हिस्सा दो अक्ष के बीच परिवर्तन समारोह का अनुमान लगा रहा था। मैंने उसके लिए myCurveFit का उपयोग किया ।

> dput(combined_80_8192 %>% filter (time > 270, time < 280))
structure(list(run = c(268L, 268L, 268L, 268L, 268L, 268L, 268L, 
268L, 268L, 268L, 263L, 263L, 263L, 263L, 263L, 263L, 263L, 263L, 
263L, 263L, 269L, 269L, 269L, 269L, 269L, 269L, 269L, 269L, 269L, 
269L, 261L, 261L, 261L, 261L, 261L, 261L, 261L, 261L, 261L, 261L, 
267L, 267L, 267L, 267L, 267L, 267L, 267L, 267L, 267L, 267L, 265L, 
265L, 265L, 265L, 265L, 265L, 265L, 265L, 265L, 265L, 266L, 266L, 
266L, 266L, 266L, 266L, 266L, 266L, 266L, 266L, 262L, 262L, 262L, 
262L, 262L, 262L, 262L, 262L, 262L, 262L, 264L, 264L, 264L, 264L, 
264L, 264L, 264L, 264L, 264L, 264L, 260L, 260L, 260L, 260L, 260L, 
260L, 260L, 260L, 260L, 260L), repetition = c(8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
), module = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "scenario.node[0].nicVLCTail.phyVLC", class = "factor"), 
    configname = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L), .Label = "Road-Vlc", class = "factor"), packetByteLength = c(8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 
    8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L, 8192L
    ), numVehicles = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L
    ), dDistance = c(80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L, 
    80L, 80L, 80L, 80L, 80L, 80L, 80L, 80L), time = c(270.166006903445, 
    271.173853699836, 272.175873251122, 273.177524313334, 274.182946177105, 
    275.188959464989, 276.189675339937, 277.198250244799, 278.204619457189, 
    279.212562800009, 270.164199199177, 271.168527215152, 272.173072994958, 
    273.179210429715, 274.184351047337, 275.18980754378, 276.194816792995, 
    277.198598277809, 278.202398083519, 279.210634593917, 270.210674322891, 
    271.212395107473, 272.218871923292, 273.219060500457, 274.220486359614, 
    275.22401452372, 276.229646658839, 277.231060448138, 278.240407241942, 
    279.2437126347, 270.283554249858, 271.293168593832, 272.298574288769, 
    273.304413221348, 274.306272082517, 275.309023049011, 276.317805897347, 
    277.324403550028, 278.332855848701, 279.334046374594, 270.118608539613, 
    271.127947700074, 272.133887145863, 273.135726000491, 274.135994529981, 
    275.136563912708, 276.140120735361, 277.144298344151, 278.146885137621, 
    279.147552358659, 270.206015567272, 271.214618077209, 272.216566814903, 
    273.225435592582, 274.234014573683, 275.242949179958, 276.248417809711, 
    277.248800670023, 278.249750333404, 279.252926560188, 270.217182684494, 
    271.218357511397, 272.224698488895, 273.231112784327, 274.238740508457, 
    275.242715184122, 276.249053562718, 277.250325509798, 278.258488063493, 
    279.261141590137, 270.282904173953, 271.284689544638, 272.294220723234, 
    273.299749415592, 274.30628880553, 275.312075103126, 276.31579134717, 
    277.321905523606, 278.326305136748, 279.333056502253, 270.258991527456, 
    271.260224091407, 272.270076810133, 273.27052037648, 274.274119348094, 
    275.280808254502, 276.286353887245, 277.287064312339, 278.294444793276, 
    279.296772014594, 270.333066283904, 271.33877455992, 272.345842319903, 
    273.350858180493, 274.353972278505, 275.360454510107, 276.365088896161, 
    277.369166956941, 278.372571708911, 279.38017503079), distanceToTx = c(80.255266401689, 
    80.156059067023, 79.98823695539, 79.826647129071, 79.76678667135, 
    79.788239825292, 79.734539327997, 79.74766421514, 79.801243848241, 
    79.765920888341, 80.255266401689, 80.15850240049, 79.98823695539, 
    79.826647129071, 79.76678667135, 79.788239825292, 79.735078924078, 
    79.74766421514, 79.801243848241, 79.764622734914, 80.251248121732, 
    80.146436869316, 79.984682320466, 79.82292012342, 79.761908518748, 
    79.796988776281, 79.736920997657, 79.745038376718, 79.802638836686, 
    79.770029970452, 80.243475525691, 80.127918207499, 79.978303140866, 
    79.816259117883, 79.749322030693, 79.809916018889, 79.744456560867, 
    79.738655068783, 79.788697533211, 79.784288359619, 80.260412958482, 
    80.168426829066, 79.992034911214, 79.830845773284, 79.7756751763, 
    79.778156038931, 79.732399593756, 79.752769548846, 79.799967731078, 
    79.757585110481, 80.251248121732, 80.146436869316, 79.984682320466, 
    79.822062073459, 79.75884601899, 79.801590491435, 79.738335109094, 
    79.74347007248, 79.803215965043, 79.771471198955, 80.250257298678, 
    80.146436869316, 79.983831684476, 79.822062073459, 79.75884601899, 
    79.801590491435, 79.738335109094, 79.74347007248, 79.803849157574, 
    79.771471198955, 80.243475525691, 80.130180105198, 79.978303140866, 
    79.816881283718, 79.749322030693, 79.80984572883, 79.744456560867, 
    79.738655068783, 79.790548644175, 79.784288359619, 80.246349000313, 
    80.137056554491, 79.980581246037, 79.818924707937, 79.753176142361, 
    79.808777040341, 79.741609845588, 79.740770913572, 79.796316397253, 
    79.777593733292, 80.238796415443, 80.119021911134, 79.974810568944, 
    79.814065350562, 79.743657315504, 79.810146783217, 79.749945098869, 
    79.737122584544, 79.781650522348, 79.791554933936), headerNoError = c(0.99999999989702, 
    0.9999999999981, 0.99999999999946, 0.9999999928026, 0.99999873265475, 
    0.77080141574964, 0.99007491438593, 0.99994396605059, 0.45588747062284, 
    0.93484381262491, 0.99999999989702, 0.99999999999816, 0.99999999999946, 
    0.9999999928026, 0.99999873265475, 0.77080141574964, 0.99008458785106, 
    0.99994396605059, 0.45588747062284, 0.93480223051707, 0.99999999989735, 
    0.99999999999789, 0.99999999999946, 0.99999999287551, 0.99999876302649, 
    0.46903147501117, 0.98835168988253, 0.99994427085086, 0.45235035271542, 
    0.93496741877335, 0.99999999989803, 0.99999999999781, 0.99999999999948, 
    0.99999999318224, 0.99994254156311, 0.46891362282273, 0.93382613917348, 
    0.99994594904099, 0.93002915596843, 0.93569767251247, 0.99999999989658, 
    0.99999999998074, 0.99999999999946, 0.99999999272802, 0.99999871586781, 
    0.76935240919896, 0.99002587758346, 0.99999881589732, 0.46179415706093, 
    0.93417422376389, 0.99999999989735, 0.99999999999789, 0.99999999999946, 
    0.99999999289347, 0.99999876940486, 0.46930769326427, 0.98837353639905, 
    0.99994447154714, 0.16313586712094, 0.93500824170148, 0.99999999989744, 
    0.99999999999789, 0.99999999999946, 0.99999999289347, 0.99999876940486, 
    0.46930769326427, 0.98837353639905, 0.99994447154714, 0.16330039178981, 
    0.93500824170148, 0.99999999989803, 0.99999999999781, 0.99999999999948, 
    0.99999999316541, 0.99994254156311, 0.46794586553266, 0.93382613917348, 
    0.99994594904099, 0.9303627789484, 0.93569767251247, 0.99999999989778, 
    0.9999999999978, 0.99999999999948, 0.99999999311433, 0.99999878195152, 
    0.47101897739483, 0.93368891853679, 0.99994556595217, 0.7571113417265, 
    0.93553999975802, 0.99999999998191, 0.99999999999784, 0.99999999999971, 
    0.99999891129658, 0.99994309267792, 0.46510628979591, 0.93442584181035, 
    0.99894450514543, 0.99890078483692, 0.76933812306423), receivedPower_dbm = c(-93.023492290586, 
    -92.388378035287, -92.205716340607, -93.816400586752, -95.023489422885, 
    -100.86308557253, -98.464763536915, -96.175707680373, -102.06189538385, 
    -99.716653422746, -93.023492290586, -92.384760627397, -92.205716340607, 
    -93.816400586752, -95.023489422885, -100.86308557253, -98.464201120719, 
    -96.175707680373, -102.06189538385, -99.717150021506, -93.022927803442, 
    -92.404017215549, -92.204561341714, -93.814319484729, -95.016990717792, 
    -102.01669022332, -98.558088145955, -96.173817001483, -102.07406915124, 
    -99.71517574876, -93.021813165972, -92.409586309743, -92.20229160243, 
    -93.805335867418, -96.184419849593, -102.01709540787, -99.728735187547, 
    -96.163233028048, -99.772547164798, -99.706399753853, -93.024204617071, 
    -92.745813384859, -92.206884754512, -93.818508150122, -95.027018807793, 
    -100.87000577258, -98.467607232407, -95.005311380324, -102.04157607608, 
    -99.724619517, -93.022927803442, -92.404017215549, -92.204561341714, 
    -93.813803344588, -95.015606885523, -102.0157405687, -98.556982278361, 
    -96.172566862738, -103.21871579865, -99.714687230796, -93.022787428238, 
    -92.404017215549, -92.204274688493, -93.813803344588, -95.015606885523, 
    -102.0157405687, -98.556982278361, -96.172566862738, -103.21784988098, 
    -99.714687230796, -93.021813165972, -92.409950613665, -92.20229160243, 
    -93.805838770576, -96.184419849593, -102.02042267497, -99.728735187547, 
    -96.163233028048, -99.768774335378, -99.706399753853, -93.022228914406, 
    -92.411048503835, -92.203136463155, -93.807357409082, -95.012865008237, 
    -102.00985717796, -99.730352912911, -96.165675535906, -100.92744056572, 
    -99.708301333236, -92.735781110993, -92.408137395049, -92.119533319039, 
    -94.982938427575, -96.181073124017, -102.03018610927, -99.721633629806, 
    -97.32940323644, -97.347613268692, -100.87007386786), snr = c(49.848348091678, 
    57.698190927109, 60.17669971462, 41.529809724535, 31.452202106925, 
    8.1976890851341, 14.240447804094, 24.122884195464, 6.2202875499406, 
    10.674183333671, 49.848348091678, 57.746270018264, 60.17669971462, 
    41.529809724535, 31.452202106925, 8.1976890851341, 14.242292077376, 
    24.122884195464, 6.2202875499406, 10.672962852322, 49.854827699773, 
    57.49079026127, 60.192705735317, 41.549715223147, 31.499301851462, 
    6.2853718719014, 13.937702343688, 24.133388256416, 6.2028757927148, 
    10.677815810561, 49.867624820879, 57.417115267867, 60.224172277442, 
    41.635752021705, 24.074540962859, 6.2847854917092, 10.644529778044, 
    24.19227425387, 10.537686730745, 10.699414795917, 49.84017267426, 
    53.139646558768, 60.160512118809, 41.509660845114, 31.42665220053, 
    8.1846370024428, 14.231126423354, 31.584125885363, 6.2494585568733, 
    10.654622041348, 49.854827699773, 57.49079026127, 60.192705735317, 
    41.55465351989, 31.509340361646, 6.2867464196657, 13.941251828322, 
    24.140336174865, 4.765718874642, 10.679016976694, 49.856439162736, 
    57.49079026127, 60.196678846453, 41.55465351989, 31.509340361646, 
    6.2867464196657, 13.941251828322, 24.140336174865, 4.7666691818074, 
    10.679016976694, 49.867624820879, 57.412299088098, 60.224172277442, 
    41.630930975211, 24.074540962859, 6.279972363168, 10.644529778044, 
    24.19227425387, 10.546845071479, 10.699414795917, 49.862851240855, 
    57.397787176282, 60.212457625018, 41.61637603957, 31.529239767749, 
    6.2952688513108, 10.640565481982, 24.178672145334, 8.0771089950663, 
    10.694731030907, 53.262541905639, 57.43627424514, 61.382796189332, 
    31.747253311549, 24.093100244121, 6.2658701281075, 10.661949889074, 
    18.495227442305, 18.417839037171, 8.1845086722809), frameId = c(15051, 
    15106, 15165, 15220, 15279, 15330, 15385, 15452, 15511, 15566, 
    15019, 15074, 15129, 15184, 15239, 15298, 15353, 15412, 15471, 
    15526, 14947, 14994, 15057, 15112, 15171, 15226, 15281, 15332, 
    15391, 15442, 14971, 15030, 15085, 15144, 15203, 15262, 15321, 
    15380, 15435, 15490, 14915, 14978, 15033, 15092, 15147, 15198, 
    15257, 15312, 15371, 15430, 14975, 15034, 15089, 15140, 15195, 
    15254, 15313, 15368, 15427, 15478, 14987, 15046, 15105, 15160, 
    15215, 15274, 15329, 15384, 15447, 15506, 14943, 15002, 15061, 
    15116, 15171, 15230, 15285, 15344, 15399, 15454, 14971, 15026, 
    15081, 15136, 15195, 15258, 15313, 15368, 15423, 15478, 15039, 
    15094, 15149, 15204, 15263, 15314, 15369, 15428, 15487, 15546
    ), packetOkSinr = c(0.99999999314881, 0.9999999998736, 0.99999999996428, 
    0.99999952114066, 0.99991568416005, 3.00628034688444e-08, 
    0.51497487795954, 0.99627877136019, 0, 0.011303253101957, 
    0.99999999314881, 0.99999999987726, 0.99999999996428, 0.99999952114066, 
    0.99991568416005, 3.00628034688444e-08, 0.51530974419663, 
    0.99627877136019, 0, 0.011269851265775, 0.9999999931708, 
    0.99999999985986, 0.99999999996428, 0.99999952599145, 0.99991770469509, 
    0, 0.45861812482641, 0.99629897628155, 0, 0.011403119534097, 
    0.99999999321568, 0.99999999985437, 0.99999999996519, 0.99999954639936, 
    0.99618434878558, 0, 0.010513119213425, 0.99641022914441, 
    0.00801687746446111, 0.012011103529927, 0.9999999931195, 
    0.99999999871861, 0.99999999996428, 0.99999951617905, 0.99991456738049, 
    2.6525298291169e-08, 0.51328066587104, 0.9999212220316, 0, 
    0.010777054258914, 0.9999999931708, 0.99999999985986, 0.99999999996428, 
    0.99999952718674, 0.99991812902805, 0, 0.45929307038653, 
    0.99631228046814, 0, 0.011436292559188, 0.99999999317629, 
    0.99999999985986, 0.99999999996428, 0.99999952718674, 0.99991812902805, 
    0, 0.45929307038653, 0.99631228046814, 0, 0.011436292559188, 
    0.99999999321568, 0.99999999985437, 0.99999999996519, 0.99999954527918, 
    0.99618434878558, 0, 0.010513119213425, 0.99641022914441, 
    0.00821047996950475, 0.012011103529927, 0.99999999319919, 
    0.99999999985345, 0.99999999996519, 0.99999954188106, 0.99991896371849, 
    0, 0.010410830482692, 0.996384831822, 9.12484388049251e-09, 
    0.011877185067536, 0.99999999879646, 0.9999999998562, 0.99999999998077, 
    0.99992756868677, 0.9962208785486, 0, 0.010971897073662, 
    0.93214999078663, 0.92943956665979, 2.64925478221656e-08), 
    snir = c(49.848348091678, 57.698190927109, 60.17669971462, 
    41.529809724535, 31.452202106925, 8.1976890851341, 14.240447804094, 
    24.122884195464, 6.2202875499406, 10.674183333671, 49.848348091678, 
    57.746270018264, 60.17669971462, 41.529809724535, 31.452202106925, 
    8.1976890851341, 14.242292077376, 24.122884195464, 6.2202875499406, 
    10.672962852322, 49.854827699773, 57.49079026127, 60.192705735317, 
    41.549715223147, 31.499301851462, 6.2853718719014, 13.937702343688, 
    24.133388256416, 6.2028757927148, 10.677815810561, 49.867624820879, 
    57.417115267867, 60.224172277442, 41.635752021705, 24.074540962859, 
    6.2847854917092, 10.644529778044, 24.19227425387, 10.537686730745, 
    10.699414795917, 49.84017267426, 53.139646558768, 60.160512118809, 
    41.509660845114, 31.42665220053, 8.1846370024428, 14.231126423354, 
    31.584125885363, 6.2494585568733, 10.654622041348, 49.854827699773, 
    57.49079026127, 60.192705735317, 41.55465351989, 31.509340361646, 
    6.2867464196657, 13.941251828322, 24.140336174865, 4.765718874642, 
    10.679016976694, 49.856439162736, 57.49079026127, 60.196678846453, 
    41.55465351989, 31.509340361646, 6.2867464196657, 13.941251828322, 
    24.140336174865, 4.7666691818074, 10.679016976694, 49.867624820879, 
    57.412299088098, 60.224172277442, 41.630930975211, 24.074540962859, 
    6.279972363168, 10.644529778044, 24.19227425387, 10.546845071479, 
    10.699414795917, 49.862851240855, 57.397787176282, 60.212457625018, 
    41.61637603957, 31.529239767749, 6.2952688513108, 10.640565481982, 
    24.178672145334, 8.0771089950663, 10.694731030907, 53.262541905639, 
    57.43627424514, 61.382796189332, 31.747253311549, 24.093100244121, 
    6.2658701281075, 10.661949889074, 18.495227442305, 18.417839037171, 
    8.1845086722809), ookSnirBer = c(8.8808636558081e-24, 3.2219795637026e-27, 
    2.6468895519653e-28, 3.9807779074715e-20, 1.0849324265615e-15, 
    2.5705217057696e-05, 4.7313805615763e-08, 1.8800438086075e-12, 
    0.00021005320203921, 1.9147343768384e-06, 8.8808636558081e-24, 
    3.0694773489537e-27, 2.6468895519653e-28, 3.9807779074715e-20, 
    1.0849324265615e-15, 2.5705217057696e-05, 4.7223753038869e-08, 
    1.8800438086075e-12, 0.00021005320203921, 1.9171738578051e-06, 
    8.8229427230445e-24, 3.9715925056443e-27, 2.6045198111088e-28, 
    3.9014083702734e-20, 1.0342658440386e-15, 0.00019591630514278, 
    6.4692014108683e-08, 1.8600094209271e-12, 0.0002140067535655, 
    1.9074922485477e-06, 8.7096574467175e-24, 4.2779443633862e-27, 
    2.5231916788231e-28, 3.5761615214425e-20, 1.9750692814982e-12, 
    0.0001960392878411, 1.9748966344895e-06, 1.7515881895994e-12, 
    2.2078334799411e-06, 1.8649940680806e-06, 8.954486301678e-24, 
    3.2021085732779e-25, 2.690441113724e-28, 4.0627628846548e-20, 
    1.1134484878561e-15, 2.6061691733331e-05, 4.777159157954e-08, 
    9.4891388749738e-16, 0.00020359398491544, 1.9542110660398e-06, 
    8.8229427230445e-24, 3.9715925056443e-27, 2.6045198111088e-28, 
    3.8819641115984e-20, 1.0237769828158e-15, 0.00019562832342849, 
    6.4455095380046e-08, 1.8468752030971e-12, 0.0010099091367628, 
    1.9051035165106e-06, 8.8085966897635e-24, 3.9715925056443e-27, 
    2.594108048185e-28, 3.8819641115984e-20, 1.0237769828158e-15, 
    0.00019562832342849, 6.4455095380046e-08, 1.8468752030971e-12, 
    0.0010088638355194, 1.9051035165106e-06, 8.7096574467175e-24, 
    4.2987746909572e-27, 2.5231916788231e-28, 3.593647329558e-20, 
    1.9750692814982e-12, 0.00019705170257492, 1.9748966344895e-06, 
    1.7515881895994e-12, 2.1868296425817e-06, 1.8649940680806e-06, 
    8.7517439682173e-24, 4.3621551072316e-27, 2.553168170837e-28, 
    3.6469582463164e-20, 1.0032983660212e-15, 0.00019385229409318, 
    1.9830820164805e-06, 1.7760568361323e-12, 2.919419915209e-05, 
    1.8741284335866e-06, 2.8285944348148e-25, 4.1960751547207e-27, 
    7.8468215407139e-29, 8.0407329049747e-16, 1.9380328071065e-12, 
    0.00020004849911333, 1.9393279417733e-06, 5.9354475879597e-10, 
    6.4258355913627e-10, 2.6065221215415e-05), ookSnrBer = c(8.8808636558081e-24, 
    3.2219795637026e-27, 2.6468895519653e-28, 3.9807779074715e-20, 
    1.0849324265615e-15, 2.5705217057696e-05, 4.7313805615763e-08, 
    1.8800438086075e-12, 0.00021005320203921, 1.9147343768384e-06, 
    8.8808636558081e-24, 3.0694773489537e-27, 2.6468895519653e-28, 
    3.9807779074715e-20, 1.0849324265615e-15, 2.5705217057696e-05, 
    4.7223753038869e-08, 1.8800438086075e-12, 0.00021005320203921, 
    1.9171738578051e-06, 8.8229427230445e-24, 3.9715925056443e-27, 
    2.6045198111088e-28, 3.9014083702734e-20, 1.0342658440386e-15, 
    0.00019591630514278, 6.4692014108683e-08, 1.8600094209271e-12, 
    0.0002140067535655, 1.9074922485477e-06, 8.7096574467175e-24, 
    4.2779443633862e-27, 2.5231916788231e-28, 3.5761615214425e-20, 
    1.9750692814982e-12, 0.0001960392878411, 1.9748966344895e-06, 
    1.7515881895994e-12, 2.2078334799411e-06, 1.8649940680806e-06, 
    8.954486301678e-24, 3.2021085732779e-25, 2.690441113724e-28, 
    4.0627628846548e-20, 1.1134484878561e-15, 2.6061691733331e-05, 
    4.777159157954e-08, 9.4891388749738e-16, 0.00020359398491544, 
    1.9542110660398e-06, 8.8229427230445e-24, 3.9715925056443e-27, 
    2.6045198111088e-28, 3.8819641115984e-20, 1.0237769828158e-15, 
    0.00019562832342849, 6.4455095380046e-08, 1.8468752030971e-12, 
    0.0010099091367628, 1.9051035165106e-06, 8.8085966897635e-24, 
    3.9715925056443e-27, 2.594108048185e-28, 3.8819641115984e-20, 
    1.0237769828158e-15, 0.00019562832342849, 6.4455095380046e-08, 
    1.8468752030971e-12, 0.0010088638355194, 1.9051035165106e-06, 
    8.7096574467175e-24, 4.2987746909572e-27, 2.5231916788231e-28, 
    3.593647329558e-20, 1.9750692814982e-12, 0.00019705170257492, 
    1.9748966344895e-06, 1.7515881895994e-12, 2.1868296425817e-06, 
    1.8649940680806e-06, 8.7517439682173e-24, 4.3621551072316e-27, 
    2.553168170837e-28, 3.6469582463164e-20, 1.0032983660212e-15, 
    0.00019385229409318, 1.9830820164805e-06, 1.7760568361323e-12, 
    2.919419915209e-05, 1.8741284335866e-06, 2.8285944348148e-25, 
    4.1960751547207e-27, 7.8468215407139e-29, 8.0407329049747e-16, 
    1.9380328071065e-12, 0.00020004849911333, 1.9393279417733e-06, 
    5.9354475879597e-10, 6.4258355913627e-10, 2.6065221215415e-05
    )), class = "data.frame", row.names = c(NA, -100L), .Names = c("run", 
"repetition", "module", "configname", "packetByteLength", "numVehicles", 
"dDistance", "time", "distanceToTx", "headerNoError", "receivedPower_dbm", 
"snr", "frameId", "packetOkSinr", "snir", "ookSnirBer", "ookSnrBer"
))

परिवर्तन समारोह का पता लगाना

  1. y1 -> y2 इस फ़ंक्शन का उपयोग द्वितीयक y अक्ष के डेटा को पहले y अक्ष के अनुसार "सामान्यीकृत" करने के लिए किया जाता है

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

परिवर्तन समारोह: f(y1) = 0.025*x + 2.75


  1. y2 -> y1 इस फ़ंक्शन का उपयोग पहली y अक्ष के ब्रेक पॉइंट को दूसरी y अक्ष के मानों में बदलने के लिए किया जाता है। ध्यान दें कि अक्ष अब स्वैप किया गया है।

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

परिवर्तन समारोह: f(y1) = 40*x - 110


प्लॉटिंग

ध्यान दें कि ggplotडेटा को "ऑन-द-फ्लाई" में बदलने के लिए कॉल में ट्रांसफ़ॉर्मेशन फ़ंक्शन का उपयोग कैसे किया जाता है

ggplot(data=combined_80_8192 %>% filter (time > 270, time < 280), aes(x=time) ) +
  stat_summary(aes(y=receivedPower_dbm ), fun.y=mean, geom="line", colour="black") +
  stat_summary(aes(y=packetOkSinr*40 - 110 ), fun.y=mean, geom="line", colour="black", position = position_dodge(width=10)) +
  scale_x_continuous() +
  scale_y_continuous(breaks = seq(-0,-110,-10), "y_first", sec.axis=sec_axis(~.*0.025+2.75, name="y_second") ) 

पहला stat_summaryकॉल वह है जो पहले y अक्ष के लिए आधार सेट करता है। दूसरी stat_summaryकॉल को डेटा को बदलने के लिए कहा जाता है। याद रखें कि सभी डेटा पहले y अक्ष के आधार के रूप में लेंगे। ताकि पहले y अक्ष के लिए डेटा को सामान्य किया जा सके। डेटा पर परिवर्तन फ़ंक्शन का उपयोग करने के लिए:y=packetOkSinr*40 - 110

अब दूसरी धुरी को बदलने के लिए मैं scale_y_continuousकॉल के भीतर विपरीत फ़ंक्शन का उपयोग करता हूं sec.axis=sec_axis(~.*0.025+2.75, name="y_second"):।

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


2
आर इस तरह की बात कर सकता है, coef(lm(c(-70, -110) ~ c(1,0)))और coef(lm(c(1,0) ~ c(-70, -110)))। आप इस तरह के रूप में एक सहायक समारोह निर्धारित कर सकते हैं equationise <- function(range = c(-70, -110), target = c(1,0)){ c = coef(lm(target ~ range)) as.formula(substitute(~ a*. + b, list(a=c[[2]], b=c[[1]]))) }
बैप्टिस्ट

हाँ, मुझे पता है ... बस सोचा कि साइट अधिक सहज होगी
user4786271

4

हम निश्चित रूप से बेस आर funtion का उपयोग करके दोहरी वाई-एक्साइज के साथ एक प्लॉट बना सकते हैं plot

# pseudo dataset
df <- data.frame(x = seq(1, 1000, 1), y1 = sample.int(100, 1000, replace=T), y2 = sample(50, 1000, replace = T))

# plot first plot 
with(df, plot(y1 ~ x, col = "red"))

# set new plot
par(new = T) 

# plot second plot, but without axis
with(df, plot(y2 ~ x, type = "l", xaxt = "n", yaxt = "n", xlab = "", ylab = ""))

# define y-axis and put y-labs
axis(4)
with(df, mtext("y2", side = 4))

1

आप facet_wrap(~ variable, ncol= )एक नई तुलना बनाने के लिए एक चर पर उपयोग कर सकते हैं । यह एक ही धुरी पर नहीं है, लेकिन यह समान है।


1

मैं हैडली (और अन्य) के साथ स्वीकार करता हूं और सहमत हूं , कि अलग-अलग वाई-स्केल "मौलिक रूप से त्रुटिपूर्ण" हैं। यह कहने के बाद कि - मैं अक्सर इच्छा करता ggplot2था कि फीचर - विशेष रूप से, जब डेटा व्यापक-प्रारूप में हो और मैं जल्दी से डेटा की कल्पना या जांच करना चाहता हूं (केवल व्यक्तिगत उपयोग के लिए)।

हालांकि tidyverseलाइब्रेरी डेटा को लॉन्ग-फॉर्मेट (जैसे facet_grid()काम करेगा) में परिवर्तित करना काफी आसान बना देती है , प्रक्रिया अभी भी तुच्छ नहीं है, जैसा कि नीचे देखा गया है:

library(tidyverse)
df.wide %>%
    # Select only the columns you need for the plot.
    select(date, column1, column2, column3) %>%
    # Create an id column – needed in the `gather()` function.
    mutate(id = n()) %>%
    # The `gather()` function converts to long-format. 
    # In which the `type` column will contain three factors (column1, column2, column3),
    # and the `value` column will contain the respective values.
    # All the while we retain the `id` and `date` columns.
    gather(type, value, -id, -date) %>%
    # Create the plot according to your specifications
    ggplot(aes(x = date, y = value)) +
        geom_line() +
        # Create a panel for each `type` (ie. column1, column2, column3).
        # If the types have different scales, you can use the `scales="free"` option.
        facet_grid(type~., scales = "free")

Ggplot2 लिखने के समय पहले से ही इसका समर्थन किया sec_axis
कोनराड रुडोल्फ

0

हैडली द्वारा दिए गए जवाब में स्टीफन फ्यू की रिपोर्ट में एक दिलचस्प संदर्भ दिया गया है कि रेखांकन में दोहरे स्केल अक्ष क्या वे कभी सर्वश्रेष्ठ समाधान हैं?

मुझे नहीं पता कि ओपी का "काउंट" और "रेट" के साथ क्या मतलब है, लेकिन एक त्वरित खोज मुझे काउंट्स और रेट्स देती है , इसलिए मुझे उत्तरी अमेरिकी पर्वतारोहण 1 में दुर्घटनाओं के बारे में कुछ डेटा मिलता है :

Years<-c("1998","1999","2000","2001","2002","2003","2004")
Persons.Involved<-c(281,248,301,276,295,231,311)
Fatalities<-c(20,17,24,16,34,18,35)
rate=100*Fatalities/Persons.Involved
df<-data.frame(Years=Years,Persons.Involved=Persons.Involved,Fatalities=Fatalities,rate=rate)
print(df,row.names = FALSE)

 Years Persons.Involved Fatalities      rate
  1998              281         20  7.117438
  1999              248         17  6.854839
  2000              301         24  7.973422
  2001              276         16  5.797101
  2002              295         34 11.525424
  2003              231         18  7.792208
  2004              311         35 11.254019

और फिर मैंने उक्त रिपोर्ट के पृष्ठ 7 पर (जैसा कि ओ.पी. के अनुरोध को बार चार्ट के रूप में गिनता है और लाइन चार्ट के रूप में दरों का अनुसरण करते हैं) के अनुसार ग्राफ को करने की कोशिश की:

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

df2<-df
df2$Persons.Involved <- 100*df$Persons.Involved/df$Persons.Involved[1]
df2$rate <- 100*df$rate/df$rate[1]
plot(ggplot(df2)+
  geom_bar(aes(x=Years,weight=Persons.Involved))+
  geom_line(aes(x=Years,y=rate,group=1))+
  theme(text = element_text(size=30))
  )

और यह परिणाम है: यहां छवि विवरण दर्ज करें

लेकिन मुझे यह बहुत पसंद नहीं है और मैं आसानी से इस पर एक किंवदंती नहीं बना पा रहा हूं ...

1 विलियमसन, जेड, एट अल। उत्तर अमेरिकी पर्वतारोहण 2005 में दुर्घटनाएं। द माउंटेनियर्स बुक्स, 2005।


0

यह प्रतीत होता है कि एक साधारण प्रश्न है, लेकिन यह लगभग 2 मूलभूत प्रश्नों से टकराता है। ए) तुलनात्मक चार्ट में प्रस्तुत करते समय एक बहु-स्केलर डेटा के साथ कैसे व्यवहार करें, और दूसरी बात, बी) क्या यह आर प्रोग्रामिंग के कुछ अंगूठे नियम प्रथाओं के बिना किया जा सकता है जैसे कि i) डेटा पिघलाना, ii) मुखर, iii मौजूदा एक और परत। नीचे दिया गया समाधान उपरोक्त दोनों स्थितियों को संतुष्ट करता है क्योंकि यह डेटा को बिना रीसेल किए और दूसरी बात, बताई गई तकनीकों का उपयोग नहीं करता है।

यहाँ परिणाम है, बेहतर और बेहतर

इस विधि के बारे में अधिक जानने के इच्छुक लोगों के लिए, कृपया नीचे दिए गए लिंक का अनुसरण करें। डेटा को फिर से स्केल किए बिना सलाखों के साथ 2- y अक्ष चार्ट कैसे प्लॉट करें


0

मैंने पाया कि इस उत्तर ने मुझे सबसे अधिक मदद की, लेकिन पाया कि कुछ किनारे मामले थे जो इसे विशेष रूप से नकारात्मक मामलों में सही ढंग से नहीं संभालते थे, और यह भी कि मेरी सीमाएँ 0 दूरी थी (जो कि अगर हम हथियाने लगे तो क्या हो सकता है) डेटा की अधिकतम / मिनट से हमारी सीमाएं)। परीक्षण से लगता है कि यह लगातार काम करता है

मैं निम्नलिखित कोड का उपयोग करता हूं। यहाँ मुझे लगता है कि हमारे पास [X1, x2] है जिसे हम [y1, y2] में बदलना चाहते हैं। जिस तरह से मैंने इसे संभाला, वह था [X1, x2] को [0,1] (एक साधारण पर्याप्त ट्रांसफ़ॉर्मन) में बदलने के लिए, फिर [0,1] से [y1, y2] तक।

climate <- tibble(
  Month = 1:12,
  Temp = c(-4,-4,0,5,11,15,16,15,11,6,1,-3),
  Precip = c(49,36,47,41,53,65,81,89,90,84,73,55)
)
#Set the limits of each axis manually:

  ylim.prim <- c(0, 180)   # in this example, precipitation
ylim.sec <- c(-4, 18)    # in this example, temperature



  b <- diff(ylim.sec)/diff(ylim.prim)

#If all values are the same this messes up the transformation, so we need to modify it here
if(b==0){
  ylim.sec <- c(ylim.sec[1]-1, ylim.sec[2]+1)
  b <- diff(ylim.sec)/diff(ylim.prim)
}
if (is.na(b)){
  ylim.prim <- c(ylim.prim[1]-1, ylim.prim[2]+1)
  b <- diff(ylim.sec)/diff(ylim.prim)
}


ggplot(climate, aes(Month, Precip)) +
  geom_col() +
  geom_line(aes(y = ylim.prim[1]+(Temp-ylim.sec[1])/b), color = "red") +
  scale_y_continuous("Precipitation", sec.axis = sec_axis(~((.-ylim.prim[1]) *b  + ylim.sec[1]), name = "Temperature"), limits = ylim.prim) +
  scale_x_continuous("Month", breaks = 1:12) +
  ggtitle("Climatogram for Oslo (1961-1990)")  

यहाँ मुख्य भाग यह है कि हम द्वितीयक y अक्ष को बदल देते हैं ~((.-ylim.prim[1]) *b + ylim.sec[1])और फिर व्युत्क्रम को वास्तविक मानों में लागू करते हैं y = ylim.prim[1]+(Temp-ylim.sec[1])/b)। हमें यह भी सुनिश्चित करना चाहिए limits = ylim.prim

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.