如果我已经有 y 刻度,则用逗号(和 K?MM?)格式化 ggplot2 轴标签 [英] Formatting ggplot2 axis labels with commas (and K? MM?) if I already have a y-scale

查看:10
本文介绍了如果我已经有 y 刻度,则用逗号(和 K?MM?)格式化 ggplot2 轴标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to format Cost and Revenue (both in thousands) and Impressions (in millions) data for a ggplot graph's y-axis labels.

我的绘图从 31 天前运行到昨天",并为 ylim(c(min,max)) 选项使用该期间的最小值和最大值.仅显示成本示例,

My plot runs from 31 days ago to 'yesterday' and uses the min and max values over that period for the ylim(c(min,max)) option. Showing just the Cost example,

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("")

我想 a) 想在 y 轴上用逗号表示成千上万,b) 就像这些数字的缩写,用K"表示千或用MM"表示数百万.我意识到 b) 可能是一项艰巨的任务,但目前 a) 无法通过

I would a) like to represent thousands and millions on the y-axis with commas, and b) like those numbers abbreviated and with 'K' for thousands or 'MM' for millions. I realize b) may be a tall order, but for now a) cannot be accomplished with

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 调用中的限制,然后抛出上面的错误,无论如何.

I have tried putting the scale_y_continuous(labels = comma) section after the geom_line()layer (which throws the error above) or at the end of all the ggplot layers, which overrides my limits in the ylim call and then throws the error above, anyway.

有什么想法吗?

推荐答案

对于逗号格式,您需要包含 label=commascales 库.您讨论的错误"实际上只是一个警告,因为您同时使用了 ylimscale_y_continuous.第二个调用覆盖第一个.您可以改为在对 scale_y_continuous 的一次调用中设置限制并指定逗号分隔的标签:

For the comma formatting, you need to include the scales library for label=comma. The "error" you discussed is actually just a warning, because you used both ylim and then scale_y_continuous. The second call overrides the first. You can instead set the limits and specify comma-separated labels in a single call to 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])))

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

Another option would be to melt your data to long format before plotting, which reduces the amount of code needed and streamlines aesthetic mappings:

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 的建议),您还需要除以适当的 10 次方.例如:

Either way, to put the y values in terms of thousands or millions you could divide the y values by 1,000 or 1,000,000. I've used dollar_format() below, but I think you'll also need to divide by the appropriate power of ten if you use unit_format (per @joran's suggestion). For example:

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 设置自定义颜色和线型.

Use scale_color_manual and scale_linetype_manual to set custom colors and linetypes, if desired.

这篇关于如果我已经有 y 刻度,则用逗号(和 K?MM?)格式化 ggplot2 轴标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆