ফ্রিকোয়েন্সি / মান অনুসারে পৃথক x স্কেল অর্ডার করুন


137

আমি বিচ্ছিন্ন এক্স স্কেল সহ জিগপ্লাট ব্যবহার করে একটি ডজড বার চার্ট তৈরি করছি, এক্স অক্ষটি এখন বর্ণানুক্রমিকভাবে সাজানো হয়েছে, তবে আমার এটি পুনরায় সাজানো দরকার যাতে এটি y- অক্ষের মান দ্বারা অর্ডার করা হয় (অর্থাৎ, দীর্ঘতম বারটি হবে বাম দিকে অবস্থিত)।

আমি অর্ডার বা সাজানোর চেষ্টা করেছি, তবে এক্স-অক্ষগুলি বাছাই করতে পেরেছি, তবে বারগুলি যথাক্রমে নয়।

আমি কি ভুল করেছি?

উত্তর:


105

এক্স-অক্ষে ম্যানুয়ালি ফ্যাক্টরের স্তরগুলি সেট করার চেষ্টা করুন। উদাহরণ স্বরূপ:

library(ggplot2)
# Automatic levels
ggplot(mtcars, aes(factor(cyl))) + geom_bar()    

ফ্যাক্টর স্তরগুলির সাথে গাড়িগুলির ডেটাসেটের জিজিপ্লট স্বয়ংক্রিয়ভাবে নির্ধারিত হয়

# Manual levels
cyl_table <- table(mtcars$cyl)
cyl_levels <- names(cyl_table)[order(cyl_table)]
mtcars$cyl2 <- factor(mtcars$cyl, levels = cyl_levels)
# Just to be clear, the above line is no different than:
# mtcars$cyl2 <- factor(mtcars$cyl, levels = c("6","4","8"))
# You can manually set the levels in whatever order you please. 
ggplot(mtcars, aes(cyl2)) + geom_bar()

ফ্যাক্টর স্তরগুলির সাথে গাড়িগুলির ডেটাসেটের জিপিপ্লট ম্যানুয়ালি পুনরায় সাজানো

জেমস তার উত্তরে যেভাবে উল্লেখ করেছেন, reorderফ্যাক্টর স্তরগুলিকে পুনরায় অর্ডার করার বুদ্ধিমান পদ্ধতি।

mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x)))
ggplot(mtcars, aes(cyl3)) + geom_bar()

পুনরায় অর্ডার ফাংশনটি ব্যবহার করে ফ্যাক্টর স্তরগুলির সাথে গাড়িগুলির ডেটাসেটের জিপিপ্লট


197

আমার পক্ষে সর্বোত্তম উপায়টি ছিল আমার সাথে limitsপ্যারামিটার হিসাবে প্রয়োজন অনুসারে বিভাগগুলির সাথে ভেক্টর ব্যবহার করা scale_x_discrete। আমি মনে করি এটি বেশ সহজ এবং সোজা সমাধান।

ggplot(mtcars, aes(factor(cyl))) + 
  geom_bar() + 
  scale_x_discrete(limits=c(8,4,6))

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


1
@ হেন্ডি ইরাওয়ান কোনও কিংবদন্তি নেই যতক্ষণ না আপনি অন্যান্য মাত্রা (রঙ, পূরণ) একই ভেরিয়েবলটিতে ম্যাপ করে থাকেন।
গ্রেগর টমাস

5
আমি মনে করি এটিই সেরা উত্তর। এটি এক্স-অক্ষের মানগুলির ক্রম নিয়ন্ত্রণ করে এবং ডেটা-ফ্রেমের রূপান্তর বা প্রভাবিত করে না। কলটির মধ্যে থাকা সত্ত্বেও, ডেটা ব্যবহারের factorএবং reorderবৈশিষ্ট্যের বৈশিষ্ট্যগুলি পরিবর্তন ggplot()করে এবং তাই সমস্যাটি হাতের কাছে করার জন্য প্রয়োজনের চেয়ে বেশি করে।
mjandrews

2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত !! কোডের একক মার্জিত (পূর্বনির্ধারিত) লাইনে আপনি করতে পারেন এমন কিছুর জন্য কোডের 2 থেকে 3 লাইন লিখে জিনিসগুলিকে কেন জটিল করবেন?
শিলসুর

1
এটি আমার জন্য y এর মান দিয়ে x অর্ডার করার জন্যও কাজ করেছিল:scale_x_discrete(limits = DT$x[order(-DT$y)])+
আর্মিপ্যাঙ্ক

38

আপনি ব্যবহার করতে পারেন reorder:

qplot(reorder(factor(cyl),factor(cyl),length),data=mtcars,geom="bar")

সম্পাদনা:

বামে সবচেয়ে দীর্ঘতম বার পেতে আপনাকে কিছুটা কালডেজ ব্যবহার করতে হবে:

qplot(reorder(factor(cyl),factor(cyl),function(x) length(x)*-1),
   data=mtcars,geom="bar")

আমি এটিরও নেতিবাচক উচ্চতা আশা করব, কিন্তু এটি হয় না, তাই এটি কার্যকর হয়!


5
আমি হতবাক হয়েছি এই উত্তরটির আরও বেশি অগ্রগতি নেই, 90% সময় এটির সঠিক উপায় এটি।
গ্রেগর থমাস

1
আমি মনে করি উভয় ফ্যাক্টর কলগুলি অতিরিক্ত প্রয়োজন। প্রথম আর্গুমেন্টের জন্য ফ্যাক্টারে একটি অন্তর্নিহিত কল রয়েছে এবং hte দ্বিতীয় আর্গুমেন্টটিকে সংখ্যা হিসাবে ধরে নেওয়া হয়।
IRTFM

একটি ব্যাখ্যা যা আমাকে এই সমাধানগুলি হুডের নীচে কী করছে তা বুঝতে সাহায্য করেছিল: rstudio-pubs-static.s3.amazonaws.com/…
কিথপজল্লি

30

হ্যাডলি নামক একটি প্যাকেজ তৈরি করছে forcats। এই প্যাকেজটি কাজটিকে এত সহজ করে তুলেছে। আপনি fct_infreq()যখন কোনও ফ্যাক্টরের ফ্রিকোয়েন্সি দ্বারা এক্স-অক্ষের ক্রম পরিবর্তন করতে চান তখন আপনি শোষণ করতে পারেন। mtcarsএই পোস্টে উদাহরণের ক্ষেত্রে , আপনি cylপ্রতিটি স্তরের ফ্রিকোয়েন্সি অনুসারে স্তরগুলি পুনঃক্রম করতে চান । স্তরটি যা প্রায়শই দেখা যায় তা বাম পাশে থাকে। আপনার প্রয়োজন হয় fct_infreq()

library(ggplot2)
library(forcats)

ggplot(mtcars, aes(fct_infreq(factor(cyl)))) +
geom_bar() +
labs(x = "cyl")

আপনি যদি অন্য পথে যেতে চান তবে আপনি fct_rev()পাশাপাশি ব্যবহার করতে পারেন fct_infreq()

ggplot(mtcars, aes(fct_rev(fct_infreq(factor(cyl))))) +
geom_bar() +
labs(x = "cyl") 

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


2

আমি বুঝতে পারি যে এটি পুরানো, তবে আমি তৈরি করা এই ফাংশনটি সেখানকার কারও পক্ষে উপকারী:

order_axis<-function(data, axis, column)
{
  # for interactivity with ggplot2
  arguments <- as.list(match.call())
  col <- eval(arguments$column, data)
  ax <- eval(arguments$axis, data)

  # evaluated factors
  a<-reorder(with(data, ax), 
             with(data, col))

  #new_data
  df<-cbind.data.frame(data)
  # define new var
  within(df, 
         do.call("<-",list(paste0(as.character(arguments$axis),"_o"), a)))
}

এখন, এই ফাংশনটি দিয়ে আপনি ggplot2 এর সাথে ইন্টারেক্টিভ প্লট করতে পারেন, এর মতো:

ggplot(order_axis(df, AXIS_X, COLUMN_Y), 
       aes(x = AXIS_X_o, y = COLUMN_Y)) +
        geom_bar(stat = "identity")

যেমন দেখা যায়, order_axisফাংশনটি একই নামে নতুন একটি কলাম সহ _oশেষে কিন্তু শেষে একটি ডেটা ফ্রেম তৈরি করে । এই নতুন কলামটিতে আরোহী ক্রমের স্তর রয়েছে, সুতরাং ggplot2 স্বয়ংক্রিয়ভাবে সেই ক্রমে প্লট হয়।

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


আমার ধারণা আমি reorderসরাসরি ব্যবহারের তুলনায় এর সুবিধা দেখছি না see না না ggplot(df, aes(x = reorder(AXIS_X, COLUMN_Y), y = COLUMN_Y)) + ...একই জিনিস করে, প্রায় হিসাবে সংক্ষেপে, এবং সাহায্যকারী ফাংশন ছাড়া?
গ্রেগর টমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.