ऑर्डर असतत x स्केल को आवृत्ति / मान से


137

मैं असतत एक्स स्केल के साथ ggplot का उपयोग करके एक चकमा देने वाला बार चार्ट बना रहा हूं, x अक्ष को अब वर्णानुक्रम में व्यवस्थित किया गया है, लेकिन मुझे इसे फिर से व्यवस्थित करने की आवश्यकता है ताकि यह y- अक्ष (यानी, सबसे लंबा बार) के मूल्य से आदेश दिया जाए बाईं ओर स्थित हो)।

मैंने ऑर्डर या सॉर्ट करने की कोशिश की, लेकिन एक्स-अक्ष को क्रमबद्ध करें, लेकिन क्रमशः बार नहीं।

मैंने क्या गल्त किया है?

जवाबों:


105

एक्स-अक्ष पर कारक के स्तरों को मैन्युअल रूप से सेट करने का प्रयास करें। उदाहरण के लिए:

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

कारक स्तरों के साथ कार डेटासेट का ggplot स्वचालित रूप से निर्धारित होता है

# 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()

कारक स्तरों वाले कार डेटासेट के ggplot को मैन्युअल रूप से फिर से व्यवस्थित किया गया है

जैसा कि जेम्स ने अपने उत्तर में बताया है, reorderकारक स्तरों को फिर से व्यवस्थित करने का मुहावरेदार तरीका है।

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

कारक स्तर वाले कारों के डेटासेट के ggplot को रीऑर्डर फ़ंक्शन का उपयोग करके पुन: व्यवस्थित किया गया


197

मेरे लिए सबसे अच्छा तरीका श्रेणियों के साथ वेक्टर का उपयोग कर रहा था ताकि मुझे limitsपैरामीटर की आवश्यकता हो scale_x_discrete। मुझे लगता है कि यह बहुत सरल और सीधा समाधान है।

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

यहां छवि विवरण दर्ज करें


1
@ हेंडइयरन तब तक कोई किंवदंती नहीं है जब तक कि आपको अन्य आयाम (रंग, भरण) नहीं मिले हों, वे भी उसी चर में मैप किए गए हों।
ग्रेगर थॉमस

5
मुझे लगता है कि यह सबसे अच्छा जवाब है। यह x- अक्ष मानों के क्रम को नियंत्रित करता है और डेटा-फ़्रेम को परिवर्तित या प्रभावित नहीं करता है। डेटा का उपयोग factorऔर reorderपरिवर्तन की विशेषताओं, ggplot()कॉल के भीतर यद्यपि , और इसलिए यह हाथ में समस्या के लिए जरूरत से ज्यादा करता है।
mjandrews

2
यह स्वीकृत उत्तर होना चाहिए !! कोड की 2 से 3 पंक्तियों को एक ही सुरुचिपूर्ण (पूर्वनिर्धारित) पंक्ति में करने के लिए चीजों को जटिल क्यों करें?
सिलसूर

1
इसने मेरे लिए x को y के मान से क्रम देने का भी काम किया: scale_x_discrete(limits = DT$x[order(-DT$y)])+
armipunk

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/…
keithpjolley

30

हैडली नामक एक पैकेज विकसित कर रहा है forcats। यह पैकेज कार्य को इतना आसान बनाता है। fct_infreq()जब आप किसी कारक की आवृत्ति द्वारा x- अक्ष के क्रम को बदलना चाहते हैं तो आप शोषण कर सकते हैं । 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सीधे इस्तेमाल करने की तुलना में नहीं देखता । ggplot(df, aes(x = reorder(AXIS_X, COLUMN_Y), y = COLUMN_Y)) + ...समान रूप से और सहायक समारोह के बिना, के बारे में एक ही काम नहीं करता है ?
ग्रिगोर थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.