मैं ggplot2 पैकेज का उपयोग करके अपने डेटा को स्टैक्ड बार चार्ट के रूप में प्लॉट करने का प्रयास कर रहा हूं। में चाहता हूं:

  1. एक्स अक्ष पर डेटाफ्रेम की पंक्ति नाम प्राप्त करें;
  2. महीने के हिसाब से मानों का योग करें और प्रत्येक कॉलम के अनुसार विभाजन भी दिखाएं;
  3. हर महीने घटते क्रम में मूल्यों को क्रमित करें।

मेरी जानकारी:

neg.trans <- data.frame( Fraud = c(1.686069964, 2.95565648, 
1.170119649,0.429596978),
DeviceDeposit= c( 0.86629,0.61366,0.97226,0.42835),
Usagefees= c(2.2937235,2.294725,2.587091,1.841178),
SecurityDeposit= c(1.616816492, 3.036161258,5.820125209, 2.62082681), 
row.names=c("2018-Oct","2018-Nov","2018-Dec","2019-Jan"))

मैं एक चार्ट जेनरेट करना चाहता हूं जो नीचे जैसा दिखता है:

this

क्या आर के साथ ऐसा करना संभव है?

0
Arjun Raaghav 24 जिंदा 2019, 16:26

2 जवाब

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

यहां तारीखों का एक बेहतर संचालन और एक अधिक आधार आर (अच्छी तरह से अभी भी ggplot2... का उपयोग कर रहा है) समाधान है:

library(tidyverse)

my.df <- neg.trans %>%
  # Convert the row.names to a proper column so it can be the x-axis
  rownames_to_column("Date") %>% 
  # Format the Date colum with parse_date, %Y is the symbol for year, %b for abbrev. months
  mutate(Date = parse_date(Date, format = "%Y-%b")) %>%
  # Transform the data from wide to long format
  gather("type", "value", -Date)

ggplot(my.df, aes(Date, value, fill = type)) + 
  geom_col() +
  scale_x_date(date_labels = "%Y-%b") # Take care of the correct date-labels

enter image description here

library(ggplot2)

# Convert the row.names to a proper column so it can be the x-axis
neg.trans$Date <- row.names(neg.trans)

# Columns which should be gathered into one 
ids <- c("Fraud", "DeviceDeposit", "Usagefees", "SecurityDeposit")

# Transform the data from wide to long format
my.df <- reshape(neg.trans, idvar = "Date", varying = list(ids), 
                 times = ids, v.names = "value", direction = "long")
row.names(my.df) <- NULL

# Add a day to each Date so we can transform it
my.df$Date <- paste0(my.df$Date, "-01")
# Format the Date colum with as.Date, %Y is for year, %b for abbrev. months, %d for day
my.df$Date <- as.Date(my.df$Date, format = "%Y-%b-%d")

ggplot(my.df, aes(Date, value, fill = time)) + 
  geom_col() +
  scale_x_date(date_labels = "%Y-%b")

enter image description here

अवरोही ओडरिंग

यदि आप अपने कॉलम अलग-अलग ऑर्डर करना चाहते हैं तो आप निम्न कार्य कर सकते हैं (https://stackoverflow.com/a/53598064/5892059< से अनुकूलित /ए>)

my.df <- my.df %>% 
  arrange(Date, type) %>% 
  mutate(type = factor(type)) %>% 
  arrange(Date, -value) 

aux <- with(my.df, match(sort(unique(type)), type))

ggplot(my.df, aes(Date, value, fill = interaction(-value, Date))) + 
  geom_col() + 
  scale_fill_manual(values = scales::hue_pal()(4)[my.df$type],
                    labels = with(my.df, type[aux]), 
                    breaks = with(my.df, interaction(-value, Date)[aux]))  +
  scale_x_date(date_labels = "%Y-%b")

मेरी राय में यह भ्रमित करने वाला लगता है।

enter image description here

2
kath 24 जिंदा 2019, 20:38

इस? उम्मीद है कि कोई एक संपादन का सुझाव देता है। जिस तरह से मैंने तारीख को संभाला है वह वास्तव में सबसे अच्छा नहीं है।

     library(tidyverse)
       df<-neg.trans %>% 
  mutate(Date=row.names(.),Day=rep(1,nrow(.)),Date=paste(Date,Day,sep="-0"))
df<-df %>% 
  mutate(Date=as.factor(Date)) 
levels(df$Date)<-c("2018-Oct-01","2018-Nov-01","2018-Dec-01","2019-Jan-01")
df%>% 
  gather("ID","Value",-Date,-Day) %>% 
  select(-Day) %>% 
  ggplot(aes(Date,Value,fill=ID)) + geom_col()

नोट:

     Months<-sapply(strsplit(as.character(df$Date),"-"),"[[",2)
        Months<-recode(Months,"Dec"=12,"Nov"=11,"Oct"=10,"Jan"=1)
      df %>% 
  mutate(Months=Months,Date=str_remove_all(df$Date,"-.*"),
         Date=make_date(Date,Months,Day),Date=as.factor(Date)) %>% 
  gather("ID","Value",-Date,-Day,-Months) %>% 
  arrange(Date) %>% 
  select(-Day,-Months) %>% 
  ggplot(aes(Date,Value,fill=ID)) + geom_col()
0
NelsonGon 24 जिंदा 2019, 17:20