স্থিতিশীল ম্যাপিং রয়েছে এমন ggplot2 এর শ্রেণীবদ্ধ ভেরিয়েবলগুলিকে কীভাবে রঙ নির্ধারণ করবেন?


178

আমি গত মাসে আর এর সাথে দ্রুত গতিতে উঠছি।

এখানে আমার প্রশ্ন:

স্থিতিশীল ম্যাপিং রয়েছে এমন ggplot2- এ শ্রেণীবদ্ধ ভেরিয়েবলগুলিতে রঙ নির্ধারণের একটি ভাল উপায় কী? গ্রাফের একটি সেট জুড়ে আমার ধারাবাহিক রঙের প্রয়োজন যা বিভিন্ন সাবসেট এবং বিভিন্ন সংখ্যক শ্রেণিবদ্ধ ভেরিয়েবলগুলি রয়েছে।

উদাহরণ স্বরূপ,

plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line()

যেখানে categoricalData5 স্তর আছে।

এবং তারপর

plot2 <- ggplot(data.subset, aes(xData.subset, yData.subset, 
                                 color=categoricaldData.subset)) + geom_line()

যেখানে categoricalData.subset3 স্তর আছে।

তবে, একটি নির্দিষ্ট স্তর যা উভয় সেটেই আলাদা রঙের সাথে শেষ হবে, যা গ্রাফগুলি একসাথে পড়া আরও শক্ত করে তোলে।

আমার কি ডেটা ফ্রেমে রঙের একটি ভেক্টর তৈরি করতে হবে? বা বিভাগগুলিতে নির্দিষ্ট রঙ নির্ধারণের অন্য কোনও উপায় আছে?

উত্তর:


187

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

এটিকে সম্বোধন করার একটি উপায় হ'ল নিম্নরূপ একটি কাস্টম ম্যানুয়াল রঙের স্কেল তৈরি করা:

#Some test data
dat <- data.frame(x=runif(10),y=runif(10),
        grp = rep(LETTERS[1:5],each = 2),stringsAsFactors = TRUE)

#Create a custom color scale
library(RColorBrewer)
myColors <- brewer.pal(5,"Set1")
names(myColors) <- levels(dat$grp)
colScale <- scale_colour_manual(name = "grp",values = myColors)

এবং তারপরে প্লটটিতে রঙ হিসাবে স্কেল যুক্ত করুন:

#One plot with all the data
p <- ggplot(dat,aes(x,y,colour = grp)) + geom_point()
p1 <- p + colScale

#A second plot with only four of the levels
p2 <- p %+% droplevels(subset(dat[4:10,])) + colScale

প্রথম প্লটটি এরকম দেখাচ্ছে:

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

এবং দ্বিতীয় চক্রান্তটি এর মতো দেখাচ্ছে:

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

এই উপায়ে আপনার যথাযথ স্তর রয়েছে তা দেখতে প্রতিটি ডেটা ফ্রেম মনে রাখতে বা চেক করার দরকার নেই।


1
এটি কাজ করবে, তবে সম্ভবত অতিরিক্ত জটিল। আমি মনে করি না এর জন্য আপনাকে একটি ম্যানুয়াল স্কেল তৈরি করতে হবে। আপনার যা দরকার তা হ'ল factorযা সমস্ত প্লটের মধ্যে সাধারণ।
অ্যান্ড্রি

14
@ এন্ড্রি - একক উপসেটের জন্য, হ্যাঁ। তবে যদি আপনি প্রচুর ডেটা সেটগুলি জাগ্রত করে থাকেন যা সবগুলি একটি আসল ডেটা ফ্রেমের সাবসেট করে তৈরি করা হয়নি তবে আমি এই কৌশলটি আরও সহজ find
জোরান

2
@ জোরান ধন্যবাদ জোড়ান এটি আমার পক্ষে কাজ করেছিল! এটি সঠিক সংখ্যার কারণগুলির সাথে একটি কিংবদন্তি তৈরি করে। আমি পদ্ধতির পছন্দ করি এবং বিভিন্ন ডেটা সেট জুড়ে রঙের ম্যাপিংগুলি পেতে তিনটি লাইনের পক্ষে ভাল-
ওয়াইনটোর

3
আমার দরকার: লাইব্রেরি ("আরলকোরব্রেভার")
প্যাট্রিকটি

4
পুরোপুরি কাজ! আমি fillScale <- scale_fill_manual(name = "grp",values = myColors)বার প্লট সহ এটি ব্যবহার করতে যুক্ত করেছি ।
পেন্ট্যান্ডারস

42

আমি একই অবস্থা দ্বারা নির্দিষ্ট malcook মধ্যে তার মন্তব্য : দুর্ভাগ্যবশত উত্তর দ্বারা থিয়েরি ggplot2 সংস্করণ 0.9.3.1 সঙ্গে কাজ করে না।

png("figure_%d.png")
set.seed(2014)
library(ggplot2)
dataset <- data.frame(category = rep(LETTERS[1:5], 100),
    x = rnorm(500, mean = rep(1:5, 100)),
    y = rnorm(500, mean = rep(1:5, 100)))
dataset$fCategory <- factor(dataset$category)
subdata <- subset(dataset, category %in% c("A", "D", "E"))

ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()

এখানে এটি প্রথম চিত্র:

ggplot এই, মিশ্রিত রং

এবং দ্বিতীয় চিত্র:

ggplot ADE, মিশ্রিত রঙ

আমরা দেখতে পাচ্ছি যে রঙগুলি স্থির থাকে না, উদাহরণস্বরূপ ই ম্যাজেন্টা থেকে ব্লুতে ই স্যুইচ করে।

দ্বারা প্রস্তাবিত হিসাবে malcook মধ্যে তার মন্তব্য দ্বারা হ্যাডলি মধ্যে তার মন্তব্য কোড যা ব্যবহার limitsকাজ সঠিকভাবে:

ggplot(subdata, aes(x = x, y = y, colour = fCategory)) +       
    geom_point() + 
    scale_colour_discrete(drop=TRUE,
        limits = levels(dataset$fCategory))

নিম্নলিখিত চিত্রটি দেয় যা সঠিক:

সঠিক ggplot

এটি থেকে প্রাপ্ত ফলাফল sessionInfo():

R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] methods   stats     graphics  grDevices utils     datasets  base     

other attached packages:
[1] ggplot2_0.9.3.1

loaded via a namespace (and not attached):
 [1] colorspace_1.2-4   dichromat_2.0-0    digest_0.6.4       grid_3.0.2        
 [5] gtable_0.1.2       labeling_0.2       MASS_7.3-29        munsell_0.4.2     
 [9] plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2 

3
আপনার এই প্রশ্নটি একটি নতুন প্রশ্ন হিসাবে পোস্ট করা উচিত, এই প্রশ্নের উল্লেখ করে এবং কেন এখানে সমাধানগুলি কাজ করে না তা দেখানো উচিত।
ব্রায়ান ডিগস

এখানে অনুরূপ প্রশ্ন জিজ্ঞাসা করা হয়েছিল , তবে আমি এটি উল্লেখ করতে চাই যে গৃহীত উত্তরটি ঠিকঠাক কাজ করে।
টনিটোভ

1
সুতরাং আমি জানি এটি পুরানো তবে আমি আশ্চর্য হয়েছি যে কিংবদন্তিতে অতিরিক্ত রঙ না রেখে এটি করার কোনও উপায় আছে কিনা।
goryh

20

সবচেয়ে সহজ সমাধান হ'ল সাবস্টেটিংয়ের আগে আপনার শ্রেণিবদ্ধ ভেরিয়েবলকে একটি ফ্যাক্টারে রূপান্তর করা। বটমলাইনটি হ'ল আপনার সমস্ত সাবসেটে ঠিক একই স্তরের সাথে আপনার একটি ফ্যাক্টর ভেরিয়েবলের প্রয়োজন।

library(ggplot2)
dataset <- data.frame(category = rep(LETTERS[1:5], 100), 
    x = rnorm(500, mean = rep(1:5, 100)), y = rnorm(500, mean = rep(1:5, 100)))
dataset$fCategory <- factor(dataset$category)
subdata <- subset(dataset, category %in% c("A", "D", "E"))

একটি চরিত্রের পরিবর্তনশীল সহ

ggplot(dataset, aes(x = x, y = y, colour = category)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = category)) + geom_point()

একটি ফ্যাক্টর ভেরিয়েবল সহ

ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()

11
সবচেয়ে সহজ উপায় হ'ল সীমা ব্যবহার করা
হ্যাডলি

1
এই প্রসঙ্গে হ্যাডলি একটি উদাহরণ দিতে পারে? আমি কোনও ফ্যাক্টরের সাথে সীমাবদ্ধতা কীভাবে ব্যবহার করব তা নিশ্চিত নই।
থিয়েরি

থাইরি ধন্যবাদ আমি আমার প্রথম পোস্টে প্রতিক্রিয়া পেয়ে খুশি। এবং থিয়েরিকে ধন্যবাদ জানাতে বা পুনরুত্পাদনযোগ্য কোড যুক্ত করা যেমন আমার পোস্টে করা উচিত ... আমার শ্রেণিবদ্ধ ভেরিয়েবলগুলি সঠিক ধরণের - কারণগুলির ছিল factors অন্য ইস্যুটি হ'ল আমি চাই কিংবদন্তিটি অব্যবহৃত উপাদানগুলি না দেখানো। কিংবদন্তি তৈরি করার সময় অব্যবহৃত চরিত্রের পরিবর্তনগুলি উপেক্ষা করে। তবে অব্যবহৃত কারণগুলি অবিরত রয়েছে। যদি আমি এগুলি এগুলিতে ফেলে রাখি: সাবডেটা $ বিভাগ <- ফ্যাক্টর (সাবডাটা $ বিভাগ) [ড্রপ = সত্য] তবে কিংবদন্তিতে সঠিক সংখ্যার কারণ রয়েছে তবে ম্যাপিংয়ের ক্ষতি হয়।
মদ

11
@ থিরি - আমার হাতে, ggplot2_0.9.3.1 ব্যবহার করে, এই পদ্ধতিটি (আর কোনও?) কাজ করে না; এফ-ক্যাটাগরিতে নির্ধারিত রং দুটি প্লটের মধ্যে পৃথক। যাইহোক, সুখে, @wintour, আমি মূর্ত যে @hadley যে পরামর্শ হয় + scale_colour_discrete(drop=TRUE,limits = levels(dataset$fCategory))রঙ সংরক্ষণে | ফ্যাক্টর সমিতি কিন্তু, যা কাজ করে, আমার হাতে ছাড়া, ড্রপ = true হয় না সম্মানিত হচ্ছে (আমি তা থেকে স্তর মুছে ফেলার জন্য আশা কিংবদন্তী). দ্রত ... নাকি এটা আমি?
ম্যালকুক

1
@ মলকুক, ড্রপ = সত্যের পরিবর্তে, আপনাকে "ব্রেক" এর মাধ্যমে কোন স্তরটি বজায়
এরিক

17

এটি একটি পুরানো পোস্ট, তবে আমি এই একই প্রশ্নের উত্তর খুঁজছিলাম,

কেন এমন কিছু চেষ্টা করবেন না:

scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))

আপনার যদি শ্রেণীবদ্ধ মান থাকে তবে এটি কাজ না করার কোনও কারণ আমি দেখছি না।


3
জোরানের উত্তরটি আসলে এটিই করে তবে myColors <- brewer.pal(5,"Set1"); names(myColors) <- levels(dat$grp)স্তরগুলিকে ম্যানুয়ালি কোড করা এড়াতে ব্যবহার করে ।
এক্সিম্যান

যাইহোক, জোড়ানের উত্তর রঙগুলির মানগুলিকে হার্ড কোড করে না। এমন ক্ষেত্রে রয়েছে যেখানে আপনার প্রদত্ত ফ্যাক্টরের জন্য নির্দিষ্ট রঙের মান প্রয়োজন।
রেনি নিফেনিগার

যখন আমি কিছু ক্ষেত্রে "হার্ড কোডিং" এর খারাপ দিকটি পাই, তবে আমি মনে করি যে প্রায়শই অ্যাবস্ট্রাকশন বিকাশকারী / কোডারগুলির স্তরগুলি তাদের কাজকে কম অ্যাক্সেসযোগ্য করে তোলে, বেশি নয়। এই ক্ষেত্রে অভিপ্রায়টি 100% স্পষ্ট। এছাড়াও এটি এমন কোনও ইউটিলিটি ফাংশন কীভাবে তৈরি করা যায় যা এই উদাহরণে প্রসারিত হয় যা নির্দিষ্ট রঙের একটি নামযুক্ত ভেক্টরকে ফিরিয়ে দেয় তা ভাবতে যথেষ্ট সহজ।
ম্যাট বার্স্টেড

16

জোরানের খুব সহায়ক উত্তরের ভিত্তিতে আমি বুলিয়ান ফ্যাক্টর ( TRUE, FALSE) এর জন্য স্থিতিশীল রঙ স্কেলের জন্য এই সমাধানটি নিয়ে আসতে সক্ষম হয়েছি ।

boolColors <- as.character(c("TRUE"="#5aae61", "FALSE"="#7b3294"))
boolScale <- scale_colour_manual(name="myboolean", values=boolColors)

ggplot(myDataFrame, aes(date, duration)) + 
  geom_point(aes(colour = myboolean)) +
  boolScale

যেহেতু কালারব্রেওয়ার বাইনারি রঙের স্কেলগুলির সাথে খুব সহায়ক নয়, তাই দুটি প্রয়োজনীয় রঙ ম্যানুয়ালি সংজ্ঞায়িত করা হয়েছে।

সত্য / মিথ্যা ফ্যাক্টর ধারণ করার mybooleanক্ষেত্রে কলামটির নাম এখানে myDataFramedateএবং durationকলামের নামগুলি এই উদাহরণে প্লটের x এবং y অক্ষকে ম্যাপ করা হবে।


আর একটি পদ্ধতি কলামে "as.character ()" প্রয়োগ করা। এটি এটিকে একটি স্ট্রিং কলাম তৈরি করবে যা স্কেল _ * _ ম্যানুয়াল দিয়ে ভালভাবে কাজ করে
সাহির মুসভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.