Ggplot2 का उपयोग करके अक्ष पर केवल पूर्णांक मान कैसे प्रदर्शित करें


87

मेरे पास निम्नलिखित कथानक हैं:

library(reshape)
library(ggplot2)
library(gridExtra)
require(ggplot2)



data2<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(15L, 11L, 29L, 42L, 0L, 5L, 21L, 
22L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
p <- ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15))


data3<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(2L, 2L, 6L, 10L, 0L, 1L, 4L, 
4L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
q<- ggplot(data3, aes(x =factor(IR), y = value, fill = Legend, width=.15))


##the plot##
q + geom_bar(position='dodge', colour='black') + ylab('Frequency') + xlab('IR')+scale_fill_grey() +theme(axis.text.x=element_text(colour="black"), axis.text.y=element_text(colour="Black"))+ opts(title='', panel.grid.major = theme_blank(),panel.grid.minor = theme_blank(),panel.border = theme_blank(),panel.background = theme_blank(), axis.ticks.x = theme_blank())

मैं चाहता हूँ कि y- अक्ष केवल पूर्णांक प्रदर्शित करे। चाहे यह गोलाई के माध्यम से पूरा किया गया हो या अधिक सुरुचिपूर्ण विधि के माध्यम से मेरे लिए वास्तव में महत्वपूर्ण नहीं है।


2
क्या आपने किसी भी पैमाने के कार्यों को देखा है? scale_y_continuousशायद?
जोरन

मैंने इसी तरह के सवालों के कुछ जवाब पढ़े और इस धारणा के तहत था कि scale_y_continuous अन्य संख्यात्मक प्रारूपों (जैसे, वैज्ञानिक संकेतन) से परिवर्तित हो गया है, लेकिन मैं पूर्णांक रूपांतरण की वास्तविक संख्या को समायोजित नहीं कर रहा था। मुझसे गलती हो सकती है ...
Atticus29

जवाबों:


41

आपके द्वारा प्रदर्शित किए जाने वाले पूर्णांकों के लिए y अक्ष के लिए आप scale_y_continuous()तर्क और तर्क के साथ breaks=ब्रेकिंग पॉइंट सेट कर सकते हैं।

ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15)) +
    geom_bar(position='dodge', colour='black')+
    scale_y_continuous(breaks=c(1,3,7,10))

41
यह समाधान केवल उन स्थितियों के लिए अच्छा है जहां आप जानते हैं कि कुल्हाड़ियों पर कौन से मूल्य हैं। एक अच्छा सामान्य समाधान नहीं।
स्वोल्फ

3
पश्चात के लिए ध्यान दें: geom_barअब y सौंदर्यबोध (साथ प्रतिस्थापित geom_col) के साथ काम नहीं करता है । और, एक सामान्य समाधान नहीं है, जबकि इस उदाहरण में एक विशिष्ट एन के साथ सुंदर फोन करना मूल मुद्दे को ठीक कर सकता है (और हार्ड-कोडिंग ब्रेक की तुलना में अधिक लचीला है): q + geom_col(position='dodge', colour='black') + xlab('IR')+scale_fill_grey() + theme_bw() + scale_y_continuous('Frequency', breaks=function(x) pretty(x, n=6))
हेलिंगस्टे

72

यदि आपके पास scalesपैकेज है, तो आप pretty_breaks()ब्रेक को मैन्युअल रूप से निर्दिष्ट किए बिना उपयोग कर सकते हैं ।

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks= pretty_breaks())

17
ऐसा लगता है कि लगभग डिफ़ॉल्ट विधि क्या करती है और मेरे पास अभी भी ब्रेक में दशमलव अंक थे।
कोरी

कहाँ pretty_breaks()से आता है?
मैरियन


12
pretty_breaks()सुंदर हैं, लेकिन हमेशा पूर्णांक नहीं होते हैं। स्पष्ट रूप से दशमलव में सुंदरता है ...
पैट्रिक

50

यही है वह जो मेरे द्वारा उपयोग किया जाता है:

ggplot(data3, aes(x = factor(IR), y = value, fill = Legend, width = .15)) +
  geom_col(position = 'dodge', colour = 'black') + 
  scale_y_continuous(breaks = function(x) unique(floor(pretty(seq(0, (max(x) + 1) * 1.1)))))

17

आप एक कस्टम लेबेलर का उपयोग कर सकते हैं। उदाहरण के लिए, यह फ़ंक्शन केवल पूर्णांक ब्रेक का उत्पादन करने की गारंटी देता है:

int_breaks <- function(x, n = 5) {
  l <- pretty(x, n)
  l[abs(l %% 1) < .Machine$double.eps ^ 0.5] 
}

इस रूप में उपयोग करें

+ scale_y_continuous(breaks = int_breaks)

यह डिफ़ॉल्ट विराम ले कर काम करता है, और केवल उन्हीं को रखते हैं जो पूर्णांक होते हैं। यदि यह आपके डेटा के लिए बहुत कम ब्रेक दिखा रहा है, तो n, जैसे:

+ scale_y_continuous(breaks = function(x) int_breaks(x, n = 10))

यह आपके पूर्णांक 1 को खोने का कारण बनता है यदि आपके पास केवल 0 से डेटा है - 1.25 या आपके पास क्या है। मैं केवल एक्स-एक्सिस पर 0 देखता हूं।
kory

1
मुझे यह सादगी पसंद है। ध्यान दें कि nआपके मूल्य सीमा के आधार पर कुछ ट्विकिंग का उपयोग किया जा सकता है। यह निर्धारित करने के लिए लगता है कि कितने विराम होंगे (मोटे तौर पर)।
मैरियन

13

इन समाधानों ने मेरे लिए काम नहीं किया और समाधानों की व्याख्या नहीं की।

breaksकरने के लिए तर्क scale_*_continuousकार्यों कि आउटपुट के रूप में इनपुट और रिटर्न टूट जाता है के रूप में सीमा लेता है एक कस्टम समारोह के साथ प्रयोग किया जा सकता है। डिफ़ॉल्ट रूप से, अक्ष सीमा को निरंतर डेटा (डेटा की सीमा के सापेक्ष) के लिए प्रत्येक पक्ष पर 5% तक विस्तारित किया जाएगा। इस विस्तार के कारण अक्ष सीमाएँ पूर्णांक मान नहीं होगी।

मैं जिस समाधान की तलाश कर रहा था, वह केवल निकटतम पूर्णांक तक की निचली सीमा को गोल करना था, ऊपरी सीमा को निकटतम पूर्णांक तक गोल करना, और फिर इन समापन बिंदुओं के बीच पूर्णांक मानों में विराम होता है। इसलिए, मैंने ब्रेक फ़ंक्शन का उपयोग किया:

brk <- function(x) seq(ceiling(x[1]), floor(x[2]), by = 1)

आवश्यक कोड स्निपेट है:

scale_y_continuous(breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1))

मूल प्रश्न से प्रजनन योग्य उदाहरण है:

data3 <-
  structure(
    list(
      IR = structure(
        c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L),
        .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"),
        class = "factor"
      ),
      variable = structure(
        c(1L, 1L, 1L, 1L,
          2L, 2L, 2L, 2L),
        .Label = c("Real queens", "Simulated individuals"),
        class = "factor"
      ),
      value = c(2L, 2L, 6L, 10L, 0L, 1L, 4L,
                4L),
      Legend = structure(
        c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
        .Label = c("Real queens",
                   "Simulated individuals"),
        class = "factor"
      )
    ),
    row.names = c(NA,-8L),
    class = "data.frame"
  )

ggplot(data3, aes(
  x = factor(IR),
  y = value,
  fill = Legend,
  width = .15
)) +
  geom_col(position = 'dodge', colour = 'black') + ylab('Frequency') + xlab('IR') +
  scale_fill_grey() +
  scale_y_continuous(
    breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1),
    expand = expand_scale(mult = c(0, 0.05))
    ) +
  theme(axis.text.x=element_text(colour="black", angle = 45, hjust = 1), 
        axis.text.y=element_text(colour="Black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(), 
        axis.ticks.x = element_blank())

2
यहां सबसे अच्छा जवाब
मार्टिन

3

Google ने मुझे इस प्रश्न पर लाया। मैं ay स्केल में वास्तविक संख्याओं का उपयोग करने की कोशिश कर रहा हूं । Y स्केल की संख्या लाखों में हैं।

तराजू पैकेज commaविधि एक परिचय अल्पविराम मेरी बड़ी संख्या है। आर-ब्लॉगर्स पर यह पोस्ट commaविधि का उपयोग करते हुए एक सरल दृष्टिकोण की व्याख्या करता है:

library(scales)

big_numbers <- data.frame(x = 1:5, y = c(1000000:1000004))

big_numbers_plot <- ggplot(big_numbers, aes(x = x, y = y))+
geom_point()

big_numbers_plot + scale_y_continuous(labels = comma)

का आनंद लें आर :)


1
यहाँ अन्य समाधान वास्तव में मेरे लिए काम नहीं करते थे, या हास्यास्पद रूप से जटिल लगते थे। यह काम किया और करने के लिए सरल था।
ब्रायन डोहर्टी

धन्यवाद @BrianDoherty, सादगी ज्यादातर चीजों के लिए महत्वपूर्ण है ...
टोनी क्रोनिन

3

मौजूदा उत्तरों में से सभी को कस्टम फ़ंक्शन की आवश्यकता होती है या कुछ मामलों में विफल हो जाते हैं।

यह रेखा पूर्णांक विराम बनाती है:

bad_scale_plot +
  scale_y_continuous(breaks = scales::breaks_extended(Q = c(1, 5, 2, 4, 3)))

अधिक जानकारी के लिए, दस्तावेज़ीकरण देखें ?labeling::extended(जो कि एक फ़ंक्शन है जिसे कहा जाता है scales::breaks_extended)।

मूल रूप से, तर्क Qअच्छी संख्या का एक सेट है जिसे एल्गोरिथ्म स्केल ब्रेक के लिए उपयोग करने की कोशिश करता है। मूल प्लॉट गैर-पूर्णांक ब्रेक (0, 2.5, 5, और 7.5) का उत्पादन करता है क्योंकि Q2.5 के लिए डिफ़ॉल्ट मान में शामिल हैं Q = c(1,5,2,2.5,4,3):।

संपादित करें: जैसा कि एक टिप्पणी में कहा गया है, गैर-पूर्णांक ब्रेक हो सकता है जब y- अक्ष में एक छोटी सी सीमा होती है। डिफ़ॉल्ट रूप से, ब्रेक के breaks_extended()बारे में बनाने की कोशिश करता है n = 5, जो कि सीमा बहुत छोटा होने पर असंभव है। त्वरित परीक्षण से पता चलता है कि 0 <y <2.5 से व्यापक रेंज पूर्णांक विराम देता है ( nइसे मैन्युअल रूप से भी घटाया जा सकता है)।


1

यह उत्तर कोरी द्वारा टिप्पणी को संबोधित करने के लिए @ एक्समैन के उत्तर पर बनाया गया है कि यदि डेटा केवल 0 से 1 तक जाता है, तो कोई ब्रेक 1 पर नहीं दिखाया गया है। ऐसा लगता है कि prettyआउटपुट में अशुद्धि के कारण ऐसा प्रतीत होता है जो 1 के समान नहीं है। 1 (अंत में उदाहरण देखें)।

इसलिए यदि आप उपयोग करते हैं

int_breaks_rounded <- function(x, n = 5)  pretty(x, n)[round(pretty(x, n),1) %% 1 == 0]

साथ में

+ scale_y_continuous(breaks = int_breaks_rounded)

0 और 1 दोनों को ब्रेक के रूप में दिखाया गया है।

एक्समैन के अंतर को समझने के लिए उदाहरण

testdata <- data.frame(x = 1:5, y = c(0,1,0,1,1))

p1 <- ggplot(testdata, aes(x = x, y = y))+
  geom_point()


p1 + scale_y_continuous(breaks = int_breaks)
p1 + scale_y_continuous(breaks =  int_breaks_rounded)

दोनों प्रारंभिक प्रश्न में दिए गए डेटा के साथ काम करेंगे।

राउंडिंग की आवश्यकता क्यों है इसका चित्रण

pretty(c(0,1.05),5)
#> [1] 0.0 0.2 0.4 0.6 0.8 1.0 1.2
identical(pretty(c(0,1.05),5)[6],1)
#> [1] FALSE

1

मुझे यह समाधान जोशुआ कुक से मिला और बहुत अच्छा काम किया।

integer_breaks <- function(n = 5, ...) {
fxn <- function(x) {
breaks <- floor(pretty(x, n, ...))
names(breaks) <- attr(breaks, "labels")
breaks
}
return(fxn)
}

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks = integer_breaks())

स्रोत है: https://joshuacook.netlify.app/post/integer-values-ggplot-axx/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.