আর-তে ggplot2 সহ হিস্টোগ্রামগুলি ওভারলেয়িং করছে


124

আমি আরে নতুন এবং একই গ্রাফটিতে 3 টি হিস্টোগ্রাম প্লট করার চেষ্টা করছি। সবকিছু ঠিকঠাক কাজ করেছে, তবে আমার সমস্যাটি হ'ল আপনি দেখতে পাচ্ছেন না যে যেখানে 2 টি হিস্টোগ্রামগুলি ওভারল্যাপ করে - তারা বরং কাটা কাটা দেখায়।

আমি যখন ঘনত্বের প্লটগুলি তৈরি করি তখন এটি নিখুঁত দেখায়: প্রতিটি বক্ররেখা একটি কালো ফ্রেমের লাইন দ্বারা বেষ্টিত থাকে এবং রঙগুলি পৃথক দেখতে যেখানে বাঁকগুলি ওভারল্যাপ হয়।

1 ম ছবিতে হিস্টোগ্রামগুলি দিয়ে অনুরূপ কিছু অর্জন করা যায় কি কেউ আমাকে বলতে পারেন? এই কোডটি আমি ব্যবহার করছি:

lowf0 <-read.csv (....)
mediumf0 <-read.csv (....)
highf0 <-read.csv(....)
lowf0$utt<-'low f0'
mediumf0$utt<-'medium f0'
highf0$utt<-'high f0'
histogram<-rbind(lowf0,mediumf0,highf0)
ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

উত্তর:


115

আপনার বর্তমান কোড:

ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

সমস্ত মান ব্যবহার করে একটি হিস্টগ্রাম ggplotনির্মাণ করতে বলছে f0এবং তারপরে ভেরিয়েবল অনুযায়ী এই একক হিস্টোগ্রামের বারগুলি রঙ করুন utt।

পরিবর্তে আপনি যা চান তা হ'ল আলফা মিশ্রণ সহ তিনটি পৃথক হিস্টোগ্রাম তৈরি করা যাতে তারা একে অপরের মাধ্যমে দৃশ্যমান হয়। সুতরাং আপনি সম্ভবত এখানে তিনটি পৃথক কল ব্যবহার করতে চান geom_histogram, যেখানে প্রত্যেকে তার নিজস্ব ডেটা ফ্রেম পান এবং পূরণ করুন:

ggplot(histogram, aes(f0)) + 
    geom_histogram(data = lowf0, fill = "red", alpha = 0.2) + 
    geom_histogram(data = mediumf0, fill = "blue", alpha = 0.2) +
    geom_histogram(data = highf0, fill = "green", alpha = 0.2) +

এখানে কিছু আউটপুট সহ একটি দৃ concrete় উদাহরণ:

dat <- data.frame(xx = c(runif(100,20,50),runif(100,40,80),runif(100,0,30)),yy = rep(letters[1:3],each = 100))

ggplot(dat,aes(x=xx)) + 
    geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'b'),fill = "blue", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'c'),fill = "green", alpha = 0.2)

যা এরকম কিছু তৈরি করে:

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

টাইপস ঠিক করতে সম্পাদিত; আপনি রঙ পূরণ করতে চেয়েছিলেন।


7
সাবসেটের ভিন্ন আকার থাকলে এটি কাজ করে না। কোন ধারণা কিভাবে এটি ঠিকানা? (যেমন "এ", "বি" তে 50 পয়েন্ট সহ ডেটা ব্যবহার করুন)
— জর্জি লিটাও

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

1
ঠিক কীভাবে আমরা এতে কিংবদন্তি যুক্ত করতে পারি ??
— শেংলিহ

1
@ শেংলিহ একটি কিংবদন্তির জন্য নীচে কোহসকের উত্তর আরও ভাল। তাঁর উত্তরটিও সাধারণত ভাল।
— 13:20

f0 কোথা থেকে আসে?
— অ্যালান

256

@ জোড়ানের নমুনা ডেটা ব্যবহার করে,

ggplot(dat, aes(x=xx, fill=yy)) + geom_histogram(alpha=0.2, position="identity")

নোট করুন যে এর ডিফল্ট অবস্থান geom_histogram"স্ট্যাক"।

এই পৃষ্ঠার "অবস্থান সমন্বয়" দেখুন:

docs.ggplot2.org/current/geom_histogram.html


30
আমি মনে করি এটি শীর্ষস্থানীয় উত্তর হওয়া উচিত যেহেতু এটি কোড পুনরাবৃত্তি করা
— এড়ায়

6
position = 'identity'এটি কেবলমাত্র বেশি পঠনযোগ্য উত্তর নয়, এটি আরও জটিল প্লটের সাথে আরও ভালভাবে জেল দেয় যেমন মেশানো কল aes()এবং aes_string()।
— রেনসা

2
এই উত্তরটি স্বয়ংক্রিয়ভাবে রঙগুলিতে একটি কিংবদন্তি প্রদর্শন করবে, যেখানে @ জোরানের উত্তর দিবে না। কিংবদন্তিটি যেমন, উদাহরণস্বরূপ ব্যবহার করে সংশোধন করা যেতে পারে scale_fill_manual()। এই ফাংশনটি হিস্টোগ্রামে রঙগুলি সংশোধন করতেও ব্যবহার করা যেতে পারে।
— মাইকেল অহলরোগ

4
এছাড়াও, নিশ্চিত হয়ে নিন যে ব্যবহৃত ভেরিয়েবলটি fillএকটি ফ্যাক্টর।
— এইচ এইচ

9
ব্যক্তিগতভাবে আমি মনে করি স্ট্যাকওভারফ্লোতে প্রথমে সর্বাধিক উত্সাহিত উত্তর তালিকাভুক্ত করা উচিত। "সঠিক উত্তর" কেবল একজন ব্যক্তির মতামত উপস্থাপন করে।
— 20:44 এ ডাকনোলস

25

যদিও ggplot2- এ একাধিক / ওভারল্যাপিং হিস্টোগ্রামগুলি প্লট করার জন্য কয়েকটি লাইনের প্রয়োজন, ফলাফল সর্বদা সন্তোষজনক নয়। হিস্টোগ্রামের মধ্যে চোখের পার্থক্য করতে পারে তা নিশ্চিত করার জন্য সীমানা এবং বর্ণের যথাযথ ব্যবহার প্রয়োজন ।

দর্শকদের বিতরণগুলির মধ্যে পার্থক্য করতে সক্ষম করতে নিম্নলিখিত ফাংশনগুলি সীমানার রং, অস্বচ্ছতা এবং সুপারম্পোজযুক্ত ঘনত্ব প্লটগুলিকে ভারসাম্যপূর্ণ করে ।

একক হিস্টোগ্রাম :

plot_histogram <- function(df, feature) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)))) +
    geom_histogram(aes(y = ..density..), alpha=0.7, fill="#33AADE", color="black") +
    geom_density(alpha=0.3, fill="red") +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    print(plt)
}

একাধিক হিস্টোগ্রাম :

plot_multi_histogram <- function(df, feature, label_column) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)), fill=eval(parse(text=label_column)))) +
    geom_histogram(alpha=0.7, position="identity", aes(y = ..density..), color="black") +
    geom_density(alpha=0.7) +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    plt + guides(fill=guide_legend(title=label_column))
}

ব্যবহার :

পছন্দসই যুক্তিগুলির সাথে উপরের ফাংশনগুলিতে কেবল আপনার ডেটা ফ্রেমটি পাস করুন :

plot_histogram(iris, 'Sepal.Width')

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

plot_multi_histogram(iris, 'Sepal.Width', 'Species')

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

অতিরিক্ত প্যারামিটার plot_multi_histogram বিভাগ লেবেল কলামে নাম।

আমরা আরও বিভিন্ন নাটকীয়ভাবে বিভিন্ন বিতরণের অর্থ সহ একটি ডেটা ফ্রেম তৈরি করে দেখতে পারি :

a <-data.frame(n=rnorm(1000, mean = 1), category=rep('A', 1000))
b <-data.frame(n=rnorm(1000, mean = 2), category=rep('B', 1000))
c <-data.frame(n=rnorm(1000, mean = 3), category=rep('C', 1000))
d <-data.frame(n=rnorm(1000, mean = 4), category=rep('D', 1000))
e <-data.frame(n=rnorm(1000, mean = 5), category=rep('E', 1000))
f <-data.frame(n=rnorm(1000, mean = 6), category=rep('F', 1000))
many_distros <- do.call('rbind', list(a,b,c,d,e,f))

আগের মতো ডেটা ফ্রেম পাস করা (এবং বিকল্পগুলি ব্যবহার করে চার্টকে প্রশস্ত করা):

options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, 'n', 'category')

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


1
এটি খুব দরকারী, আশা করি আরও মনোযোগ পেলেন।
— এডওয়ার্ড টেলার

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