একই গ্রাফটিতে ggplot2 ব্যবহার করে লাইন হিসাবে দুটি ভেরিয়েবল প্লট করা


305

একটি খুব নতুন প্রশ্ন, তবে বলুন যে আমার কাছে এই জাতীয় ডেটা রয়েছে:

test_data <-
  data.frame(
    var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
    var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
    date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
  )

এক্স-অক্ষের সাহায্যে, আমি কীভাবে টাইম সিরিজ var0এবং var1একই গ্রাফ, উভয়ই প্লট করতে পারি ? বোনাস পয়েন্টগুলি যদি আপনি বিভিন্ন রঙ তৈরি করেন এবং একটি কিংবদন্তি অন্তর্ভুক্ত করতে পারেন!dateggplot2var0var1

আমি নিশ্চিত যে এটি খুব সহজ, তবে আমি সেখানে কোনও উদাহরণ খুঁজে পাচ্ছি না।

উত্তর:


373

অল্প সংখ্যক ভেরিয়েবলের জন্য, আপনি নিজে প্লটটি নিজে নিজে তৈরি করতে পারেন:

ggplot(test_data, aes(date)) + 
  geom_line(aes(y = var0, colour = "var0")) + 
  geom_line(aes(y = var1, colour = "var1"))

3
উদাহরণস্বরূপ, তবে কীভাবে আমার নিজের রঙগুলি পছন্দসই করা যায় (উদাহরণস্বরূপ কালো এবং কমলা) ?, কারণ মনে হয় আপনি colour=পরিবর্তনশীল নাম হিসাবে ব্যবহার করছেন ।
ডারউইন পিসি

1
এমনকি colour='var_names'হ্যাডলি দ্বারা নির্দিষ্ট হিসাবে ভাল কাজ করে। তবে @ ডেভএক্স - যদি ফাংশন দ্বারা স্বয়ংক্রিয়ভাবে নির্বাচিত রংগুলির পরিবর্তে নির্দিষ্ট রঙ চয়ন করতে চান তবে আরও সুনির্দিষ্ট হবে।
I_m_LeMarque

আমি কীভাবে এটিতে একটি কিংবদন্তি যুক্ত করতে পারি?
ব্যবহারকারী 1700890

361

সাধারণ পদ্ধতির দীর্ঘ ফরম্যাট (ব্যবহার করার জন্য ডেটা রূপান্তর হয় melt()প্যাকেজ থেকে reshapeবা reshape2) অথবা gather()/ pivot_longer()থেকে tidyrপ্যাকেজ:

library("reshape2")
library("ggplot2")

test_data_long <- melt(test_data, id="date")  # convert to long format

ggplot(data=test_data_long,
       aes(x=date, y=value, colour=variable)) +
       geom_line()

ggplot2 আউটপুট

এছাড়াও দীর্ঘ থেকে ডেটা পুনরায় আকারের বিষয়ে এই প্রশ্নটি দেখুন ।


8
আপনি ডেটা gather()tidyrgather(test_data, variable, value, -date)
গলানোর

33

আপনার ggplot2 এর জন্য "প্রশস্ত" পরিবর্তে "লম্বা" ফর্ম্যাটে ডেটা থাকা দরকার। "প্রশস্ত" অর্থ প্রতি ভেরিয়েবলের সাথে আলাদা আলাদা কলাম হিসাবে প্রতি সারিতে পর্যবেক্ষণ রাখা (যেমন আপনার এখন রয়েছে) আপনাকে এটিকে একটি "লম্বা" ফর্ম্যাটে রূপান্তর করতে হবে যেখানে আপনার একটি কলাম রয়েছে যা আপনাকে ভেরিয়েবলের নাম এবং অন্য কলামে ভেরিয়েবলের মান বলবে। প্রশস্ত থেকে লম্বায় যাওয়ার প্রক্রিয়াটিকে সাধারণত "গলনা" বলা হয়। আপনি tidyr::gatherআপনার ডেটা ফ্রেম গলানোর জন্য ব্যবহার করতে পারেন :

library(ggplot2)
library(tidyr)

test_data <-
  data.frame(
    var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
    var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
    date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
  )
test_data %>%
    gather(key,value, var0, var1) %>%
    ggplot(aes(x=date, y=value, colour=key)) +
    geom_line()

একাধিক সিরিজ ggplot2

শুধু হতে পরিষ্কার dataযে ggplotগ্রাসকারী হয় মাধ্যমে এটি বংশীধ্বনিতুল্য পর gatherএই মত দেখায়:

date        key     value
2002-01-01  var0    100.00000
2002-02-01  var0    115.16388 
...
2007-11-01  var1    114.86302
2007-12-01  var1    119.30996

13

আপনার ডেটা ব্যবহার:

test_data <- data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100))

আমি একটি স্ট্যাকড সংস্করণ তৈরি করি যা এর ggplot()সাথে কাজ করতে পছন্দ করে:

stacked <- with(test_data,
                data.frame(value = c(var0, var1),
                           variable = factor(rep(c("Var0","Var1"),
                                                 each = NROW(test_data))),
                           Dates = rep(Dates, 2)))

এক্ষেত্রে উত্পাদন stackedকরা বেশ সহজ ছিল কারণ আমাদের কেবল কয়েকটি ম্যানিপুলেশন করতে হয়েছিল, reshape()এবং reshapeএবং reshape2যদি আপনার আরও জটিল বাস্তব ডেটা ম্যানিপুলেট করার জন্য সেট করা থাকে তবে কার্যকর হতে পারে।

ডেটা এই স্ট্যাকড ফর্মটিতে আসার পরে, ggplot()সমস্ত অতিরিক্ত দিয়ে আপনি যে প্লটটি চেয়েছিলেন তা উত্পাদন করার জন্য কেবলমাত্র একটি সাধারণ কল প্রয়োজন হয় (উচ্চ-স্তরের প্লটিং প্যাকেজগুলি পছন্দ latticeএবং ggplot2এর জন্য কেন এত দরকারী) তার এক কারণ :

require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()

অক্ষ লেবেল, কিংবদন্তির শিরোনাম ইত্যাদি পরিষ্কার করার জন্য আমি এটি আপনার কাছে রেখে দেব

আছে HTH


1
আমি মনে করি আপনার কোডটিতে একটি ভুল পেনেন্স রয়েছে। আমি মনে করি এটি আপনার পরে যা রয়েছে: স্ট্যাকড <- সাথে (টেস্ট_ডেটা, ডেটা.ফ্রেম (মান = সি (var0, বর্ণ 1), ভেরিয়েবল = ফ্যাক্টর (রেপ (সি ("Var0", "ভার 1"))), প্রতিটি = NROW (টেস্ট_ডেটা), তারিখ = রেপ (তারিখ, 2))। এছাড়াও, "প্রতিটি" কলামটির উদ্দেশ্য কী? এবং এটি কি আরসিএসের দেখানো উপাত্তগুলিকে গলানোর জন্য আরও জটিল এবং কম কার্যকর উপায় নয়? আমি অনুমান করি যে আমি এমন একটি উদাহরণ কল্পনা করতে পারি যেখানে গলানো কাজটি সম্পন্ন হবে না, তবে আমি কিছু মিস করছি না তবে এটি অবশ্যই এই কাজের জন্য সঠিক উপায় certainly
চেজ

1
@ কিনুন, দুঃখিত, এটি ইম্যাক্স ইএসএসের ইনডেন্টিংটি ভুল হচ্ছে। প্রত্যেকটিই একটি যুক্তি rep(), তাই আমরা সত্যিই কেবল 3 টি কলস পেয়ে যাচ্ছি stacked। আমি ইনডেন্টটি পরিষ্কার করার জন্য কোডটি সম্পাদনা করব।
গ্যাভিন সিম্পসন

1
@পশ্চাদ্ধাবন; আপনার মতামতটি melt()ভালভাবে নেওয়া হয়েছে এবং আমি নোট করছি যে পুনরায় আকারের আকার [2] প্যাকেজটি এখানে কার্যকর হবে। আমি পুনর্নির্মাণের সাথে তেমন পরিচিত নই এবং এই জাতীয় কোনও হেরফেরের জন্য এটি হাতে কল করা কল করার চেয়ে জটিল melt(), এটি কীভাবে ব্যবহার করতে হয় তা পড়ার দরকার ছিল না বলে এটি কম চেষ্টা করেছিল melt()। আরসিএস তার উত্তরটি নিয়ে লুকিয়েছিল যখন আমি আমার উত্পাদন করছিলাম; আমি যখন উত্তরটি শুরু করলাম তখন কোনও উত্তর ছিল না। বিড়ালের চামড়ার একাধিক উপায় - তারা যেমন বলে! ;-)
গ্যাভিন সিম্পসন

7

আমি আর-তেও নতুন কিন্তু জিপিপ্লট কীভাবে কাজ করে তা বোঝার চেষ্টা করে আমার মনে হয় আমি এটি করার আরও একটি উপায় পেয়েছি। আমি কেবল একটি সম্পূর্ণ নিখুঁত সমাধান হিসাবে সম্ভবত ভাগ না করে দেখুন কিছু ভিন্ন দৃষ্টিভঙ্গি যুক্ত করতে।

আমি জানি ggplot ডেটা ফ্রেমগুলির সাথে আরও ভালভাবে কাজ করার জন্য তৈরি করা হয়েছে তবে সম্ভবত এটি কখনও কখনও দরকারী হতে পারে যে আপনি ডেটা ফ্রেম ব্যবহার না করে সরাসরি দুটি ভেক্টর প্লট করতে পারেন।

তথ্য প্রস্তুত হচ্ছে. আসল তারিখের ভেক্টরের দৈর্ঘ্য 100 এবং ভার0 এবং ভার 1 এর দৈর্ঘ্য 50 রয়েছে তাই আমি কেবল উপলভ্য ডেটা (প্রথম 50 তারিখ) প্লট করি।

var0 <- 100 + c(0, cumsum(runif(49, -20, 20)))
var1 <- 150 + c(0, cumsum(runif(49, -10, 10)))
date <- seq(as.Date("2002-01-01"), by="1 month", length.out=50)    

অঙ্কন

ggplot() + geom_line(aes(x=date,y=var0),color='red') + 
           geom_line(aes(x=date,y=var1),color='blue') + 
           ylab('Values')+xlab('date')

এখানে চিত্র বর্ণনা লিখুন

তবে আমি এই ফর্ম্যাটটি ব্যবহার করে একটি সঠিক কিংবদন্তি যুক্ত করতে পারিনি। কেউ জানেন কীভাবে?


1
এটি একটি কিংবদন্তি যুক্ত করেছে ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')
ফ্লুরবিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.