প্রতিটি পাশের 2 টি অক্ষ এবং বিভিন্ন স্কেল সহ ggplot


231

আমার একটি চার্টের গণনাগুলি এবং একটি লাইন চার্টের রেট প্রদর্শন সবগুলিই একটি চার্টে রেট প্রদর্শন করার জন্য প্লট করা দরকার, আমি উভয় পৃথকভাবে করতে পারি, তবে যখন আমি তাদের একসাথে রাখি, তখন আমি প্রথম স্তরটির স্কেল (অর্থাত্ geom_bar) দ্বিতীয়টি দ্বারা আবৃত হয় স্তর (অর্থাত্ geom_line)

আমি কি অক্ষটির geom_lineডানদিকে সরাতে পারি ?


5
আপনি এখানে shwon হিসাবে একটি পদ্ধতির ব্যবহার করতে পারেন, rpubs.com/kohske/dual_axis_in_ggplot2 ?
টম Wenseleers


2
এর ভিতরে নেটিভ ggplot2বাস্তবায়ন দেখতে scale_y_*বর্তমানে নীচে স্ক্রোল করুন sec.axis
প্যাট্রিকটি

উত্তর:


106

কখনও কখনও ক্লায়েন্ট দুটি ওয়াই স্কেল চায়। তাদের "ত্রুটিযুক্ত" বক্তৃতা দেওয়া প্রায়শই অর্থহীন। তবে আমি জিনিসগুলি সঠিকভাবে করার জন্য জিপিপ্লট 2 জেদের মতো করি। আমি নিশ্চিত যে ggplot প্রকৃতপক্ষে গড় ব্যবহারকারীকে সঠিক ভিজুয়ালাইজেশন কৌশল সম্পর্কে শিক্ষিত করে চলেছে।

দুটি তথ্য সিরিজের তুলনা করতে আপনি মুখোমুখি এবং স্কেল বিনামূল্যে ব্যবহার করতে পারেন? - যেমন এখানে দেখুন: https://github.com/hadley/ggplot2/wiki/Align-two-plots-on-a- পৃষ্ঠা


30
আমি আন্ড্রেয়াসের সাথে একমত - কখনও কখনও (যেমন এখন আমার জন্য) একজন ক্লায়েন্ট একই প্লটটিতে দুটি সেট ডেটা চায় এবং প্লটটিং থিওরি সম্পর্কে কথা বলতে শুনতে চায় না। আমি হয় তাদের আর তা না চাওয়ার জন্য তাদের বোঝাতে হবে (আমি যে যুদ্ধ চালাতে চাই তা সবসময় নয়), বা তাদের বলতে হবে "আমি যে চক্রান্তের প্যাকেজটি ব্যবহার করছি তা সমর্থন করে না।" তাই আমি আজ এই বিশেষ প্রকল্পের জন্য জিজিপ্লট থেকে সরে যাচ্ছি। = (
কেন উইলিয়ামস

58
প্লটিং প্যাকেজটির কেন এটি পরিচালনা করে তার নিজস্ব মতামত toোকানো দরকার? না, ধন্যবাদ.
কলিন

5
আপনার লিঙ্কটি পচে গেছে। আপনি কি নিজের উত্তরটি সম্পাদনা করতে এবং এটি যা বলত তার সারাংশ পোস্ট করতে পারেন?
জাচ

24
এই মন্তব্যের সাথে একমত হতে পারে না (পুনরায় অভিজাত)। যত দ্রুত সম্ভব তথ্য সঞ্চিত করা খুব সাধারণ (!) সাধারণ, যেমন বার্তাটি দ্রুত পৌঁছে দেওয়ার জন্য, যেমন বৈজ্ঞানিক জার্নালগুলি দ্বারা আরোপিত কঠোর বিধিনিষেধ ইত্যাদি। অতএব, দ্বিতীয় y অক্ষ যুক্ত করা যাই হোক না কেন করা হচ্ছে, এবং ggplot, আমার মতে, এটি করতে সহায়তা করা উচিত।
স্টিঞ্জারি

57
অবাক করে দিয়ে কীভাবে "ত্রুটিযুক্ত" এবং "সঠিক পথ" এর মতো শব্দগুলি এমনভাবে ছড়িয়ে দেওয়া হয়েছে যেগুলি সেগুলি এমন কোনও তত্ত্বের ভিত্তিতে নয় যা নিজেই বেশ মতামতপূর্ণ এবং কৌতূহলযুক্ত, তবে অজানাভাবে বহু লোকের দ্বারা গ্রহণ করা হয়েছিল, যেমনটি দেখা যায় এই সম্পূর্ণরূপে অস্বাস্থ্যকর উত্তরের (যা একটি লিঙ্ক-হাড় ফেলে দেয়) লেখার সময় ২ টি আপভোট রয়েছে ot Whe তুলনা সময় সিরিজ, উদাহরণস্বরূপ, এটি একই চার্ট উভয় আছে অমূল্য হতে পারে কারণ পার্থক্যের পারস্পরিক সম্পর্ক অনেক স্পট সহজ। কেবলমাত্র হাজার হাজার উচ্চ শিক্ষিত ফিনান্স পেশাদারদের জিজ্ঞাসা করুন যারা প্রতিদিন এটি করেন।
টমাস ব্রাউন

149

জিজিপ্লট 2 এ এটি সম্ভব নয় কারণ আমি বিশ্বাস করি পৃথক y আঁশযুক্ত প্লটগুলি (y- স্কেলগুলি নয় যা একে অপরের রূপান্তর হয়) মূলত ত্রুটিযুক্ত। কিছু সমস্যা:

  • এগুলি অবিচলযোগ্য নয়: প্লটের জায়গার একটি বিন্দু দেওয়া হলেও আপনি এটিকে অনন্যতার সাথে ডেটা স্পেসের বিন্দুতে ম্যাপ করতে পারবেন না।

  • তারা অন্যান্য বিকল্পের তুলনায় সঠিকভাবে পড়তে তুলনামূলকভাবে শক্ত। বিশদ বিবরণের জন্য পেট্রা ইজেনবার্গ, আনাস্তাসিয়া বেজারিয়ানোস, পিয়েরি ড্রাগিগ্যাসিভ এবং জিন-ড্যানিয়েল ফেকেটের দ্বৈত-স্কেল ডেটা চার্টের উপর অধ্যয়ন দেখুন ।

  • এগুলি সহজেই বিভ্রান্ত করার জন্য হেরফের হয়: অক্ষগুলির আপেক্ষিক স্কেলগুলি নির্দিষ্ট করার কোনও অনন্য উপায় নেই, এগুলি ম্যানিপুলেশনের জন্য উন্মুক্ত রেখে দেয়। জাঙ্কচার্টস ব্লগের দুটি উদাহরণ: এক , দুটি

  • এগুলি নির্বিচারে: 3, 4 বা দশটি নয়, কেন কেবল 2 টি স্কেল রয়েছে?

আপনি গ্রাফিক্সে দ্বৈত-স্কেলড অক্ষগুলি শীর্ষক স্টিফেন ফিউয়ের দীর্ঘ আলোচনাটি পড়তে চাইতে পারেন তারা কি কখনও সেরা সমাধান?


39
আপনি কি আপনার মতামত বিস্তারিত বলতে আপত্তি করবেন? আলোকিত মৌচাক না করে, আমি মনে করি এটি দুটি স্বতন্ত্র ভেরিয়েবলের চক্রান্ত করার একটি বরং কমপ্যাক্ট উপায়। এটি এমন একটি বৈশিষ্ট্য যা মনে হয় বলে মনে হয়, এবং এটি beein ব্যাপকভাবে ব্যবহৃত হয়।
কার্লপি

66
@ হ্যাডলি: বেশিরভাগ ক্ষেত্রে আমি সম্মত, তবে একাধিক ওয়াই স্কেলের জন্য একটি আসল ব্যবহার রয়েছে - একই ডেটার জন্য 2 টি আলাদা ইউনিট ব্যবহার করা হয়, যেমন তাপমাত্রা সময় সিরিজের সেলসিয়াস এবং ফারেনহাইট স্কেল।
রিচি কটন

11
@ হ্যাডলি আপনার মতে আমার নয়, বা অন্য অনেক বিজ্ঞানীও নয়। অবশ্যই প্রথমটির উপরে দ্বিতীয় প্লট (সম্পূর্ণ স্বচ্ছ পটভূমি সহ) স্থাপনের মাধ্যমে এটি অর্জন করা যেতে পারে, সুতরাং তারা এক হিসাবে উপস্থিত হয়। আমি জানি না কীভাবে বাউন্ডিং বক্সেক্সের কোণগুলি একে অপরের সাথে সারিবদ্ধ / নিবন্ধিত রয়েছে তা নিশ্চিত করতে।
নিকোলাস হ্যামিল্টন

8
@ হ্যাডলি উদাহরণস্বরূপ, ওয়ালথার-লিথ জলবায়ু চিত্রগুলিতে , দুটি y অক্ষ সাধারণত ব্যবহৃত হয়। যেহেতু একটি স্থির প্রেসক্রিপশন রয়েছে কীভাবে এটি করতে হবে যে সম্ভাব্য বিভ্রান্তি ন্যূনতম ...
সেবসচব

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"))

এখানে ফলাফল (উপরের কোড + কিছু রঙের টুইট):

একটি ggplot2 এ দুটি স্কেল

ব্যবহার থেকে পয়েন্ট (সরাইয়া sec_axisযখন y_scale উল্লেখ হয় গুন যখন সিরিজটি উল্লেখ প্রতিটি মান 5 2nd ডাটা সিরিজের। অর্ডার অধিকার sec_axis সংজ্ঞা লেবেল পাওয়ার জন্য, তারপর দরকার বিভাজক 5 দ্বারা (এবং বিন্যাস।) 'তখন উপরের কোডের একটি গুরুত্বপূর্ণ অংশটি সত্যই *5জিওম_লাইন এবং ~./5সেক_এক্সিসে রয়েছে (বর্তমান সূত্রটি .5 দ্বারা বিভাজক একটি সূত্র )।

তুলনায় (আমি এখানে পদ্ধতির বিচার করতে চাই না), একে অপরের শীর্ষে দুটি চার্ট এইভাবে দেখায়:

একে অপরের উপরে দুটি চার্ট

আপনি নিজেরাই বিচার করতে পারেন যে কে এই বার্তাটি আরও ভালভাবে পরিবহণ করে ("লোককে কাজের ক্ষেত্রে বাধাগ্রস্ত করবেন না!")। অনুমান করুন যে এটি সিদ্ধান্ত নেওয়ার উপযুক্ত উপায়।

উভয় চিত্রের সম্পূর্ণ কোড (এটি উপরের তুলনায় আসলেই বেশি নয়, চালানোর জন্য সম্পূর্ণ এবং প্রস্তুত) এখানে রয়েছে: https://gist.github.com/sebastianrothbucher/de847063f32fdff02c83b75f59c36a7d আরও বিস্তারিত ব্যাখ্যা এখানে: https: // sebastianrothbucher। github.io/datascience/r/visualization/ggplot/2018/03/24/two-scales-ggplot-r.html


31

এখানে সাধারণ ব্যবহারের ক্ষেত্রে দ্বৈত Y অক্ষ রয়েছে, যেমন, জলবায়ু মাসিক তাপমাত্রা এবং বৃষ্টিপাত দেখায় showing ভেরিয়েবলের নিম্ন সীমাটি শূন্যের চেয়ে অন্য কিছুতে সেট করার মাধ্যমে আপনি মেগাট্রনের সমাধান থেকে সাধারণীকরণের জন্য এখানে একটি সহজ সমাধান:

উদাহরণ ডেটা:

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)")  

জলবায়ু লাইন হিসাবে তাপমাত্রা এবং বারপ্লট হিসাবে বৃষ্টিপাত দেখাচ্ছে

আপনি যদি নিশ্চিত করতে চান যে লাল রেখাটি ডান হাতের 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)) এটি প্রয়োগ করে না তবে স্বেচ্ছাসেবী সীমা বেছে নেয়, সমস্ত স্কেল গুছিয়ে রাখে ing । আমি উপরের কোডটি অনুলিপি করে সবেমাত্র ভেরিয়েবলের নাম এবং অক্ষের সীমা পরিবর্তন করেছি বলে আমি নিশ্চিত নই
আনেকে

@ এঙ্ক: পাঠ্যটি কিছুটা আলগা হয় যখন এটি ylim.prim এবং ylim.sec বোঝায়। তারা অক্ষের সীমাটি নির্দেশ করে না, বরং আপনার ডেটা সীমাবদ্ধ করে। যখন আপনি উল্লেখ করেছেন যে আপনি ylim.prim <- c (90, 130) এবং ylim.sec <- c (15, 30) সেট করেন তখন তাপমাত্রা গ্রাফটি বার প্লটের উপরে উপরে উঠে যায় (যখন তাপমাত্রার অক্ষটি--৫ শুরু হয়) , তবে প্রতিটি গ্রাফের অক্ষগুলি এখনও সঠিক।
ডাগ হিজার্মেন

16

আপনি একটি স্কেলিং ফ্যাক্টর তৈরি করতে পারেন যা দ্বিতীয় জিওম এবং ডান y- অক্ষে প্রয়োগ করা হয়। এটি সেবাস্তিয়ানের সমাধান থেকে উত্পন্ন।

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 বছর আগে কোহস্কে সরবরাহ করেছেন [ কোহসকে ]। বিষয়টি এবং এর সমাধানের চারপাশের প্রযুক্তিগত বিষয়গুলি এখানে স্ট্যাকওভারফ্লো [আইডি: 18989001, 29235405, 21026598] তে বেশ কয়েকটি উদাহরণে আলোচনা করা হয়েছে। সুতরাং আমি উপরের সমাধানগুলি ব্যবহার করে কেবলমাত্র একটি নির্দিষ্ট প্রকরণ এবং কিছু ব্যাখ্যামূলক ওয়াকথ্রো সরবরাহ করব।

আসুন জেনে নিই আমরা কিছু ডেটা আছে যাক Y1 দলের G1 যা কিছু ডেটা Y2 দলের G2 কিছু উপায় সম্পর্কযুক্ত যেমন পরিসীমা / স্কেল রুপান্তরিত বা কিছু গোলমাল যোগ দিয়ে। সুতরাং কেউ বাম দিকে 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())

এটি ছোট স্কেল y1 অব্ভিওসুলি বৃহত্তর স্কেল y2 দ্বারা ধসে পড়ে যাওয়ার সাথে এটি খুব ভালভাবে সারিবদ্ধ হয় না ।

চ্যালেঞ্জটি মোকাবেলা করার কৌশলটি হ'ল প্রযুক্তিগতভাবে প্রথম স্কেল y1 এর বিপরীতে উভয় ডেটা সেট প্লট করা কিন্তু দ্বিতীয় স্কেলটি দ্বিতীয় স্কোরকে মূল স্কেল y2 দেখাচ্ছে এমন একটি গৌণ অক্ষের বিরুদ্ধে প্রতিবেদন করা ।

সুতরাং আমরা ক্যালকফুজেএক্সিস একটি প্রথম সহায়ক সহায়ক ফাংশন তৈরি করি যা দেখানোর জন্য নতুন অক্ষের বৈশিষ্ট্য গণনা করে এবং সংগ্রহ করে। ফাংশনটি পছন্দ মতো আইনগুলিতে সংশোধন করা যেতে পারে (এটি কেবলমাত্র 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

এখন আমি কোহসেকের সমাধানটি দ্বিতীয় সহায়ক ফাংশন প্লটওথফজ অ্যাক্সিসে আবৃত করেছি (যার মধ্যে আমরা জিগপ্লাট অবজেক্ট এবং নতুন অক্ষের সাহায্যকারী বস্তুকে ফেলেছি):

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)
}

এখন সমস্ত একসাথে রাখা যেতে পারে: নীচের কোডগুলি দেখায়, কীভাবে প্রস্তাবিত সমাধানটি দিনে দিনে পরিবেশে ব্যবহৃত হতে পারে । প্লট কল এখন আর মূল তথ্য y2 প্লট করতে পারে না তবে ক্লোন করা সংস্করণ yf (প্রাক-গণনা করা সহায়ক অবজেক্ট ফুজএক্সিসের অভ্যন্তরে রাখা ), যা y1 এর স্কেল দিয়ে চলে । মূল ggplot বস্তু তারপর কাজে ব্যবহৃত হয় Kohske এর সাহায্যকারী ফাংশন 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 ডান দিকে

2 টি অক্ষ

সমাধানের উপরের অংশটি হ'ল এটি সোজা করে বলা যায় একটি সীমাবদ্ধ নড়বড়ে হ্যাক। এটি জিজিপ্লট কার্নেলের সাথে খেললে এটি কিছু সতর্কতা ছুঁড়ে দেবে যা আমরা সত্য-পরবর্তী স্কেলগুলি বিনিময় করি ইত্যাদি care এটি যত্ন সহকারে পরিচালনা করতে হবে এবং অন্য কোনও সেটিংয়ে কিছু অযাচিত আচরণ তৈরি করতে পারে। পাশাপাশি প্রয়োজন হিসাবে লেআউটটি পেতে সাহায্যকারী ফাংশনগুলির সাথে চারপাশে ঘুরতে হবে। কিংবদন্তির স্থান নির্ধারণ যেমন একটি সমস্যা (এটি প্যানেল এবং নতুন অক্ষের মধ্যে স্থাপন করা হবে; এই কারণেই আমি এটিকে ফেলে দিয়েছি)। 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 লাইব্রেরি ইনস্টল করা এবং লোড হওয়া সত্ত্বেও ফাংশনটি পাওয়া যায়নি।
Nneka

1
@ ডানকা মাল্টিপ্লট ফাংশনটি একটি কাস্টম ফাংশন (লিঙ্কযুক্ত পৃষ্ঠার নীচে)।
ড্রিবেল

আপনি প্লট যোগ করতে পারেন?
সিবো জিয়াং

সম্প্রতি, এমন অনেকগুলি প্যাকেজ রয়েছে যার multiplot স্ট্যাকওভারফ্লো.com
টুং

7

আমার জন্য কৌতুকপূর্ণ অংশটি দুটি অক্ষের মধ্যে রূপান্তর ফাংশনটি সন্ধান করছিল। আমি তার জন্য আমার কার্ভেভেফিট ব্যবহার করেছি।

> 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

আমরা অবশ্যই বেস আর ফান্ট ব্যবহার করে দ্বৈত ওয়াই-অ্যাক্সেস সহ একটি প্লট তৈরি করতে পারি 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

এবং তারপরে আমি উল্লিখিত প্রতিবেদনের page পৃষ্ঠায় কয়েকজনের পরামর্শ অনুসারে গ্রাফটি করার চেষ্টা করেছি (এবং বারের চার্ট হিসাবে গণনাগুলি এবং রেখার চার্ট হিসাবে রেটগুলি গ্রাফ করার জন্য ওপি-র অনুরোধ অনুসরণ করে):

অন্য কম স্পষ্ট সমাধান, যা কেবল সময়ের সিরিজের জন্য কাজ করে তা হ'ল প্রতিটি মান এবং একটি রেফারেন্স (বা সূচক) মানের মধ্যে শতাংশ পার্থক্য প্রদর্শন করে সমস্ত মানকে একটি সাধারণ পরিমাণগত স্কেলে রূপান্তর করা। উদাহরণস্বরূপ, সময়টিতে একটি নির্দিষ্ট পয়েন্ট নির্বাচন করুন যেমন গ্রাফটিতে প্রদর্শিত প্রথম অন্তর হিসাবে এবং প্রতিটি পরবর্তী মানকে এটির এবং প্রাথমিক মানের মধ্যে শতাংশের পার্থক্য হিসাবে প্রকাশ করুন। এটি প্রতিটি বিন্দুতে সময়কে প্রাথমিক বিন্দুর জন্য মান দ্বারা সময়কে ভাগ করে এবং তারপরে এটিকে 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.