如果我已经有一个y-scale

时间:2016-06-08 21:36:34

标签: r ggplot2 formatting

我正在尝试格式化ggplot图表的y轴标签的成本和收入(以千为单位)和印象数(以百万计)数据。

我的情节从31天前到昨天'并在ylim(c(min,max))选项中使用该期间的最小值和最大值。只显示成本示例,

library(ggplot2)
library(TTR)

set.seed(1984)

#make series
start <- as.Date('2016-01-01')
end <- Sys.Date()

days <- as.numeric(end - start)

#make cost and moving averages
cost <- rnorm(days, mean = 45400, sd = 11640)
date <- seq.Date(from = start, to = end - 1, by = 'day') 
cost_7 <- SMA(cost, 7)
cost_30 <- SMA(cost, 30)

df <- data.frame(Date = date, Cost = cost, Cost_7 = cost_7, Cost_30 = cost_30)


# set parameters for window
left <- end - 31
right <- end - 1

# plot series
ggplot(df, aes(x = Date, y = Cost))+
geom_line(lwd = 0.5) +
geom_line(aes(y = Cost_7), col = 'red', linetype = 3, lwd = 1) +
geom_line(aes(y = Cost_30), col = 'blue', linetype = 5, lwd = 0.75) +
xlim(c(left, right)) + 
ylim(c(min(df$Cost[df$Date > left]), max(df$Cost[df$Date > left]))) +
xlab("")

ggplot output

我希望a)用逗号表示数千和数百万的y轴,b)像那些缩写的数字和&#39; K&#39;成千上万的MM或者MM&#39;数百万。我意识到b)可能是一个很高的订单,但现在a)无法用

完成

ggplot(...) + ... + ylim(c(min, max)) + scale_y_continuous(labels = comma)

因为抛出了以下错误:

## Scale for 'y' is already present. Adding another scale for 'y', which
## will replace the existing scale.

我已尝试将scale_y_continuous(labels = comma)部分放在geom_line()图层之后(抛出上述错误)或所有ggplot图层的末尾,这会覆盖ylim中的限制无论如何,打电话然后抛出上面的错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:24)

对于逗号格式,您需要为scales添加label=comma库。 &#34;错误&#34;您讨论的实际上只是一个警告,因为您同时使用ylimscale_y_continuous。第二个调用会覆盖第一个调用。您可以在一次调用scale_y_continuous

中设置限制并指定以逗号分隔的标签
library(scales)

ggplot(df, aes(x = Date, y = Cost))+
  geom_line(lwd = 0.5) +
  geom_line(aes(y = Cost_7), col = 'red', linetype = 3, lwd = 1) +
  geom_line(aes(y = Cost_30), col = 'blue', linetype = 5, lwd = 0.75) +
  xlim(c(left, right)) + 
  xlab("") +
  scale_y_continuous(label=comma, limits=c(min(df$Cost[df$Date > left]), 
                                           max(df$Cost[df$Date > left])))

另一种选择是在绘图之前将数据融化为长格式,这样可以减少所需的代码量并简化美学映射:

library(reshape2)

ggplot(melt(df, id.var="Date"), 
       aes(x = Date, y = value, color=variable, linetype=variable))+
  geom_line() +
  xlim(c(left, right)) + 
  labs(x="", y="Cost") +
  scale_y_continuous(label=comma, limits=c(min(df$Cost[df$Date > left]), 
                                           max(df$Cost[df$Date > left])))

无论哪种方式,要将y值设置为数千或数百万,您可以将y值除以1,000或1,000,000。我已使用下面的dollar_format(),但如果您使用unit_format(根据@joran&#39}建议),我认为您还需要除以10的适当幂。例如:

div=1000

ggplot(melt(df, id.var="Date"), 
       aes(x = Date, y = value/div, color=variable, linetype=variable))+
  geom_line() +
  xlim(c(left, right)) + 
  labs(x="", y="Cost (Thousands)") +
  scale_y_continuous(label=dollar_format(),
                     limits=c(min(df$Cost[df$Date > left]), 
                              max(df$Cost[df$Date > left]))/div)

如果需要,使用scale_color_manualscale_linetype_manual设置自定义颜色和线型。

enter image description here

答案 1 :(得分:4)

我刚刚找到了解决方案。它不适用于“标签 = 逗号”。请尝试此解决方案:

scale_y_continuous(labels = scales::comma) 对我来说效果很好。