Change y limits in ggplot with facet_wrap to mix of log and regular scales

我的梦境 提交于 2019-12-24 13:24:15

问题


I have a dataset that has a wide range of values for one group. Using ggplot's facet_wrap, I would plot the y axis in a log scale for one group (the group that has the widest range of values) and regular axis for the other group.

Below is a reproducible example.

set.seed(123)

FiveLetters <- LETTERS[1:2]

df <- data.frame(MonthlyCount = sample(1:10, 36, replace=TRUE),
CustName = factor(sample(FiveLetters,size=36, replace=TRUE)),
ServiceDate =  format(seq(ISOdate(2003,1,1), by='day', length=36), 
format='%Y-%m-%d'), stringsAsFactors = F)

df$ServiceDate <- as.Date(df$ServiceDate)

# replace some counts to really high numbers for group A

df$MonthlyCount[df$CustName =="A" & df$MonthlyCount >= 9 ] <-300

df

library(ggplot2)
library(scales)

ggplot(data = df, aes(x = ServiceDate, y = MonthlyCount))  +
geom_point() +  
facet_wrap(~ CustName, ncol = 1, scales = "free_y" ) +
scale_x_date("Date", 
               labels = date_format("%Y-%m-%d"), 
               breaks = date_breaks("1 week")) +
  theme(axis.text.x = element_text(colour = "black", 
                                   size = 16, 
                                   angle = 90, 
                                   vjust = .5))

The resulting graph has two facets. The facet for group A has dots on the top and the bottom on the graph, which are difficult to compared, the facet for B is easier to read. I would like to plot facet for group A in log scale and leave the other "free".


回答1:


this does the job

ggplot(data = df, aes(x = ServiceDate, y = MonthlyCount))  +
 geom_point() +  
 facet_wrap(~ CustName, ncol = 1, scales = "free_y" ) +
 scale_x_date("Date", 
           labels = date_format("%Y-%m-%d"), 
           breaks = date_breaks("1 week")) +
scale_y_continuous(trans=log_trans(), breaks=c(1,3,10,50,100,300),
                 labels = comma_format())+
 theme(axis.text.x = element_text(colour = "black", 
        size = 16, 
        angle = 90, 
        vjust = .5))



回答2:


You can make a transformed monthly count and use that as the y-axis.

## modify monthly count
df$mcount <- with(df, ifelse(CustName == "A", log(MonthlyCount), MonthlyCount))

ggplot(data = df, aes(x = ServiceDate, y = mcount))  +
  geom_point() +  
  facet_wrap(~ CustName, ncol = 1, scales = "free_y" ) +
  scale_x_date("Date", 
               labels = date_format("%Y-%m-%d"), 
               breaks = date_breaks("1 week")) +
  theme(axis.text.x = element_text(colour = "black", 
            size = 16, 
            angle = 90, 
            vjust = .5))



来源:https://stackoverflow.com/questions/31520608/change-y-limits-in-ggplot-with-facet-wrap-to-mix-of-log-and-regular-scales

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!