मैं विषयगत मानचित्र से आंचलिक आँकड़ों के लिए हिस्टोग्राम को लगातार प्लॉट करने की कोशिश कर रहा हूँ। एक ही क्षेत्र में डेटा अक्सर कुछ इस तरह दिखता है:

dat <- data.frame("CLASS" = sample(LETTERS[1:6], 250, replace = TRUE,
                               prob = c(.15, .06, .35, .4, .02, 0)))
dat$CLASS <- factor(dat$CLASS, levels = LETTERS[1:6], ordered = T)

जिसमें क्षेत्र में सभी संभव वर्ग मौजूद नहीं हो सकते हैं।

मैं डेटा सारांश की पूर्व-गणना कर सकता हूं और लापता डेटा की परवाह किए बिना लगातार बार रंग प्राप्त करने के लिए geom_bar और मैन्युअल रंग स्केल का उपयोग कर सकता हूं:

library(dplyr)
library(ggplot2)
library(viridis)

dat_summ <- dat %>%
  group_by(CLASS, .drop = FALSE) %>%
  summarise(percentage = n() / nrow(.) * 100)

mancols <- viridis_pal()(6)
names(mancols) <- LETTERS[1:6]

ggplot(dat_summ) +
  geom_bar(aes(x = CLASS, y = percentage, fill = CLASS), 
           stat = 'identity', show.legend = FALSE) +
  scale_x_discrete(drop = FALSE) +
  scale_fill_manual(values = mancols, drop = FALSE) +
  labs(x = 'Class', y = 'Percent') +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())

geom_bar plot

लेकिन जब मैं geom_histogram का उपयोग करने का प्रयास करता हूं तो मैं रंगों को भूखंडों के अनुरूप नहीं रख सकता:

ggplot(dat) +
  geom_histogram(aes(x = CLASS,  
                 y = (..count../sum(..count..)) * 100,
                 fill = ..x..), stat = 'count', show.legend = FALSE) +
  scale_x_discrete(drop = FALSE) +
  scale_fill_viridis_c() +
  labs(x = 'Class', y = 'Percent') +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())

enter image description here

यदि बाहरी किनारों में से कोई भी कॉलम (ए, एफ) गिनती = 0 है, तो रंग उस स्थान पर पुनर्विक्रय करते हैं जहां डेटा मौजूद है। यह तब नहीं होता है जब मध्य वर्ग में से किसी एक में अंतर होता है। scale_fill_viridis_b() का उपयोग करने से समस्या का समाधान नहीं होता - यह हमेशा पैलेट को गैर-0 स्तंभों की संख्या के विरुद्ध पुन: मापता है।

क्या इस व्यवहार को रोकना और लगातार रंगों को आउटपुट करना संभव है, इससे कोई फर्क नहीं पड़ता कि कौन से कॉलम गिनती = 0 हैं, या क्या मैं अपने geom_bar दृष्टिकोण से फंस गया हूं?

1
obrl_soil 22 मई 2020, 07:27

2 जवाब

सबसे बढ़िया उत्तर

हो सकता है कि scale_fill_discrete/scale_fill_viridis_d(drop = F) वही हो जो आप चाहते हैं (fill = CLASS के साथ)।

ggplot(dat) +
  geom_histogram(aes(x = CLASS,  
                     y = (..count../sum(..count..)) * 100,
                     fill = CLASS), stat = 'count', show.legend = FALSE) +
  scale_x_discrete(drop = FALSE) +
  scale_fill_viridis_d(drop = FALSE) +
  labs(x = 'Class', y = 'Percent') +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())
1
cuttlefish44 22 मई 2020, 08:23

मुझे लगता है कि समस्या यह है कि आप सौंदर्यशास्त्र में परिकलित चर ..x.. से fill पास करते हैं। ऐसा प्रतीत होता है कि इस चर की लंबाई आपके डेटा सेट के साथ बदलती है। आप इसे scale_fill_manual से बदल सकते हैं और आपको समान प्लॉट रंग मिलेंगे, भले ही आपके क्लास वेरिएबल में कितने स्तर हों:

ggplot(dat) +
  geom_histogram(aes(x = CLASS, y = stat(count/sum(count) * 100), fill = CLASS), stat = 'count', show.legend = FALSE) +
  scale_x_discrete(drop = FALSE) +
  scale_fill_manual(values = c("#FF0000FF", "#CCFF00FF", "#00FF66FF", "#0066FFFF", "#CC00FFFF", "#FF99FFFF")) 
  labs(x = 'Class', y = 'Percent') +
  theme_minimal() +
  theme(panel.grid.minor = element_blank())
0
Paul van Oppen 22 मई 2020, 08:22