শ্রেণিবদ্ধ ভেরিয়েবলের চার্টে গণনার পরিবর্তে% দেখান


170

আমি একটি শ্রেণিবদ্ধ ভেরিয়েবলের প্লট করছি এবং পরিবর্তে প্রতিটি বিভাগের মানের জন্য গণনা প্রদর্শন করছি।

আমি ggplotবিভাগের মানগুলির শতাংশ প্রদর্শন করতে একটি উপায় খুঁজছি । অবশ্যই গণনা করা শতকরা হারের সাথে আরও একটি পরিবর্তনশীল তৈরি করা সম্ভব এবং এটির একটি প্লট করুন, তবে এটি কয়েক ডজন কয়েকবার করতে হয়েছে এবং আমি আশা করি এটি একটি কমান্ডে অর্জন করব।

আমি এমন কিছু নিয়ে পরীক্ষা নিরীক্ষা করছিলাম

qplot(mydataf) +
  stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
  scale_y_continuous(formatter = "percent")

তবে আমার ত্রুটি হওয়ার সাথে সাথে এটি অবশ্যই ভুলভাবে ব্যবহার করা উচিত।

সহজেই সেটআপটি পুনরুত্পাদন করতে এখানে একটি সরল উদাহরণ রয়েছে:

mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc");
mydataf <- factor(mydata);
qplot (mydataf); #this shows the count, I'm looking to see % displayed.

প্রকৃত ক্ষেত্রে, আমি সম্ভবত এর ggplotপরিবর্তে ব্যবহার করব qplot, তবে স্ট্যাট_বিন ব্যবহারের সঠিক উপায়টি এখনও আমাকে উপেক্ষা করে

আমি এই চারটি পদ্ধতির চেষ্টাও করেছি:

ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent');

ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent') + geom_bar();

ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent');

ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent') + geom_bar();

কিন্তু সব 4 দেয়:

Error: ggplot2 doesn't know how to deal with data of class factor

একই ত্রুটিটি সাধারণ ক্ষেত্রে প্রদর্শিত হয়

ggplot (data=mydataf, aes(levels(mydataf))) +
  geom_bar()

সুতরাং এটি কীভাবে ggplotকোনও একক ভেক্টরের সাথে ইন্টারেক্ট করে সে সম্পর্কে এটি স্পষ্টতই কিছু । আমি আমার মাথা আঁচড়াচ্ছি, সেই ত্রুটির জন্য গুগল করা একটি ফলাফল দেয় ।


2
ডেটা একটি ডেটা ফ্রেম হওয়া উচিত, একটি বেয়ার ফ্যাক্টর নয়।
হ্যাডলি

1
হ্যাডলির মন্তব্যে যোগ করা, মাইডাটাফ = ডেটাফ্রেম (মায়াডাটাফ) ব্যবহার করে আপনার ডেটাটিকে একটি ডেটা ফ্রেমে রূপান্তর করা এবং এর নামকরণ (মায়াডাটাফ) = foo নামকরণ করা কৌশলটি করবে
রামনাথ

উত্তর:


221

যেহেতু এটির উত্তর দেওয়া হয়েছিল ggplotসিন্টেক্সে কিছু অর্থবহ পরিবর্তন হয়েছে । উপরের মন্তব্যে আলোচনার সংক্ষিপ্তসার:

 require(ggplot2)
 require(scales)

 p <- ggplot(mydataf, aes(x = foo)) +  
        geom_bar(aes(y = (..count..)/sum(..count..))) + 
        ## version 3.0.0
        scale_y_continuous(labels=percent)

এখানে একটি পুনরুত্পাদনযোগ্য উদাহরণ ব্যবহার করে mtcars:

 ggplot(mtcars, aes(x = factor(hp))) +  
        geom_bar(aes(y = (..count..)/sum(..count..))) + 
        scale_y_continuous(labels = percent) ## version 3.0.0

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

এই প্রশ্নটি বর্তমানে 'জিজিপ্লট কাউন্ট বনাম শতাংশ হিস্টোগ্রাম' এর জন্য গুগলে প্রথম # হিট তাই আশা করি এটি গৃহীত উত্তরের মন্তব্যে বর্তমানে রক্ষিত সমস্ত তথ্য বিচ্ছিন্ন করতে সহায়তা করে।

মন্তব্য: যদি hpএকটি ফ্যাক্টর, ggplot আয় হিসাবে সেট করা হয়:

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


12
এই উত্তরের জন্য ধন্যবাদ। এটি শ্রেণিবদ্ধভাবে কীভাবে করবেন সে সম্পর্কে কোনও ধারণা?
ডাব্লুএফএফ

3
@ ডাব্লুএএফএর পরামর্শ অনুসারে, এই উত্তরটি মুখযুক্ত ডেটা নিয়ে কাজ করে না। @ মধ্যে Erwan এর মন্তব্য দেখুন stackoverflow.com/questions/22181132/...
LeeZamparo

1
percentউপরের কাজটি করার জন্য আপনাকে যে প্যাকেজটি এসেছে তা দিয়ে উপসর্গের প্রয়োজন হতে পারে (আমি করেছি)। ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = scales::percent)
mamymykins

geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..]))পরিবর্তে দিকগুলি ব্যবহার ব্যবহার করতে পারেন । প্রতিটি দিকের পরিমাণ 100% হওয়া উচিত।
জেভিলিমান

চারপাশে ".." দিয়ে ভেরিয়েবলগুলি স্ট্যাট () - কমান্ডের সাথে প্রতিস্থাপন করা হয়নি? ggplot2.tidyverse.org/references/stat.html
ম্যাগনাস

58

এই পরিবর্তিত কোড কাজ করা উচিত

p = ggplot(mydataf, aes(x = foo)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    scale_y_continuous(formatter = 'percent')

যদি আপনার ডেটাতে এনএ থাকে এবং আপনি চান না যে সেগুলি প্লটে অন্তর্ভুক্ত করা হোক, জিপিপ্লট-এর পক্ষে যুক্তি হিসাবে না.মিত (মায়াডাটাফ) পাস করুন।

আশাকরি এটা সাহায্য করবে.


37
দ্রষ্টব্য যে ggplot2 সংস্করণে 0.9.0 এ formatterযুক্তি আর কাজ করবে না। পরিবর্তে, আপনি কিছু চাইবেন labels = percent_format())
জোড়ান

25
এবং 0.9.0 দিয়ে আপনার scalesব্যবহারের আগে লাইব্রেরিটি লোড করা দরকার percent_format(), অন্যথায় এটি কাজ করবে না। 0.9.0 সমর্থন প্যাকেজগুলি স্বয়ংক্রিয়ভাবে লোড করে না।
অ্যান্ড্রু

1
দেখুন ? stat_bin। এটি ডেটা ফ্রেমে অতিরিক্ত কলামগুলি যুক্ত করে তা দেখায় ggplot2। সমস্ত অতিরিক্ত কলাম ফর্মের ..variable..
রামনাথ

1
এটি কি aes(y = (..count..)/sum(..count..))সহজভাবে প্রতিস্থাপনের জন্য অর্থবোধ করে aes(y = ..density..)? দৃশ্যত এটি খুব অনুরূপ (তবে এখনও আলাদা) চিত্র দেয়
আলেকজান্ডার কোসেনকভ

6
Ggplot 0.9.3.1.0 এ, আপনি প্রথমে scalesলাইব্রেরিটি লোড করতে চাইবেন , তারপরে scale_y_continuous(labels=percent)
ডক্সে


37

মার্চ ২০১.1, ggplot2২.২.১ সহ আমি মনে করি ডাটা সায়েন্স বইয়ের জন্য হ্যাডলি উইকহ্যামের আর-তে সেরা সমাধানটি ব্যাখ্যা করা হয়েছে:

ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1))

stat_countদুটি ভেরিয়েবল গণনা countকরে: ডিফল্টরূপে ব্যবহৃত হয় তবে আপনি propযেটি অনুপাত দেখায় তা বেছে নিতে পারেন ।


3
এটি জুন ২০১ of সালের সেরা উত্তর, গ্রুপ অনুসারে এবং মুখোমুখি হয়ে কাজ করে।
স্কুমিন

1
কিছু কারণে এটি আমাকে fillম্যাপিং ব্যবহার করতে দেয় না (কোনও ত্রুটি নিক্ষেপ করা হয় না, তবে কোনও পূর্ণ রঙ যুক্ত হয় না)।
ম্যাক্স ক্যান্ডোসিয়া

ফ্যাক্স ম্যাপিংয়ের জন্য আমাকে ম্যাক্সকান্ডোসিয়াকে অপসারণ করতে group = 1হয়েছিল। হতে পারে এটি সাহায্য করে
Tjebo

1
আমি যদি groupপ্যারামিটারটি সরিয়ে ফেলি তবে যদিও এটি যথাযথ শতাংশ দেখায় না, কারণ প্রতিটি অনন্য এক্স মানের জন্য সবকিছু তার নিজস্ব গ্রুপের belongs
ম্যাক্স ক্যান্ডোসিয়া

20

আপনি যদি y- অক্ষের উপর শতাংশ চান এবং বারগুলিতে লেবেল চান:

library(ggplot2)
library(scales)
ggplot(mtcars, aes(x = as.factor(am))) +
  geom_bar(aes(y = (..count..)/sum(..count..))) +
  geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) +
  scale_y_continuous(labels = percent) +
  labs(title = "Manual vs. Automatic Frequency", y = "Percent", x = "Automatic Transmission")

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

বারের লেবেল যুক্ত করার সময়, আপনি ক্লিয়ারার চার্টের জন্য y- অক্ষটি বাদ দিতে চাইতে পারেন, শেষটি যুক্ত করে:

  theme(
        axis.text.y=element_blank(), axis.ticks=element_blank(),
        axis.title.y=element_blank()
  )

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


6

আপনি যদি y অক্ষের উপর শতাংশ লেবেল কিন্তু আসল এনএস চান তবে এটি চেষ্টা করে দেখুন:

    library(scales)
perbar=function(xx){
      q=ggplot(data=data.frame(xx),aes(x=xx))+
      geom_bar(aes(y = (..count..)),fill="orange")
       q=q+    geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen") 
      q
    }
    perbar(mtcars$disp)

6

মুখযুক্ত তথ্যের জন্য এখানে একটি কার্যকারিতা রয়েছে। (@ অ্যান্ড্রু দ্বারা গৃহীত উত্তর এই ক্ষেত্রে কাজ করে না)) ধারণাটি হ'ল ডিপি্লায়ার ব্যবহার করে শতাংশের মান গণনা করা এবং তারপরে প্লটটি তৈরি করতে জিওম_কোল ব্যবহার করা।

library(ggplot2)
library(scales)
library(magrittr)
library(dplyr)

binwidth <- 30

mtcars.stats <- mtcars %>%
  group_by(cyl) %>%
  mutate(bin = cut(hp, breaks=seq(0,400, binwidth), 
               labels= seq(0+binwidth,400, binwidth)-(binwidth/2)),
         n = n()) %>%
  group_by(cyl, bin) %>%
  summarise(p = n()/n[1]) %>%
  ungroup() %>%
  mutate(bin = as.numeric(as.character(bin)))

ggplot(mtcars.stats, aes(x = bin, y= p)) +  
  geom_col() + 
  scale_y_continuous(labels = percent) +
  facet_grid(cyl~.)

এটি চক্রান্ত:

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


3

মনে রাখবেন যে আপনার পরিবর্তনশীল যদি অবিচ্ছিন্ন থাকে তবে আপনাকে geom_histogram () ব্যবহার করতে হবে, কারণ ফাংশনটি "বিনগুলি" দ্বারা ভেরিয়েবলকে গ্রুপ করবে।

df <- data.frame(V1 = rnorm(100))

ggplot(df, aes(x = V1)) +  
  geom_histogram(aes(y = (..count..)/sum(..count..))) 

# if you use geom_bar(), with factor(V1), each value of V1 will be treated as a
# different category. In this case this does not make sense, as the variable is 
# really continuous. With the hp variable of the mtcars (see previous answer), it 
# worked well since hp was not really continuous (check unique(mtcars$hp)), and one 
# can want to see each value of this variable, and not to group it in bins.
ggplot(df, aes(x = factor(V1))) +  
  geom_bar(aes(y = (..count..)/sum(..count..))) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.