在ggplot中显示数百万的轴值

Mar*_*ret 7 r ggplot2

我有一个图表,我正在绘制一些非常大的数字,数以百万计.我的观众不太可能理解科学记数法,所以我希望将y轴标记为"2M",例如200万.

这是一个例子.显示完整值(scales::comma)优于默认的科学记数法,但仍然有点忙:

library(ggplot2)
ggplot(as.data.frame(list(x = c(0, 200,100), y = c(7500000,10000000,2000000))), 
       aes(x = x, y = y)) +
  geom_point() +
  expand_limits( x = c(0,NA), y = c(0,NA)) +
  scale_y_continuous(labels = scales::comma)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我不想重新调整数据,因为我将包含具有各个数据点值的标签.

Joã*_*oão 39

我发现scales::unit_format()更具可读性:

library(dplyr)
library(scales)
library(ggplot2)

as.data.frame(
  list(x = c(0, 200, 100), 
       y = c(7500000, 10000000, 2000000))) %>%
  ggplot(aes(x, y)) +
  geom_point() +
  expand_limits(x = c(0, NA), y = c(0, NA)) +
  scale_y_continuous(labels = unit_format(unit = "M", scale = 1e-6))
Run Code Online (Sandbox Code Playgroud)

  • 无需更改数据(`mutate(y = y / 10^6)`),scale 参数可用于动态转换:`scale_y_continuous(labels = unit_format(unit = "M", scale = 1e- 6))` (3认同)
  • 请注意,在秤版本 1.1.1 中,“unit_format {scales}”已停用;`label_number {scales}` 是替换函数。 (3认同)

vin*_*ief 15

在 scales 包中,该函数会label_number_si()自动使用最佳 SI 前缀“K”来缩放和标记值?10e3,“M”代表?10e6,“B”代表?10e9,“T”代表?10e12。看这里

所以:

library(ggplot2)
ggplot(as.data.frame(list(x = c(0, 200,100), y = c(7500000,10000000,2000000))), 
       aes(x = x, y = y)) +
  geom_point() +
  expand_limits(x = c(0, NA), y = c(0,NA)) +
  scale_y_continuous(labels = scales::label_number_si())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 值得补充的是 `label_number_si()` 已被弃用,直接从[此处](https://scales.r-lib.org/reference/label_number_si.html) ...... `label_number_si()` 已被弃用,因为以前的单位实际上并没有使用SI单位,而是使用所谓的“短标度”。现在,您可以使用“label_number(scale_cut = cut_short_scale())”获得与以前相同的结果,或者如果您想要正确的 SI 单位,则使用“label_number(scale_cut = cut_si("unit"))” (2认同)

Kon*_*rad 8

值得将该函数添加到 scale 可以在不指定breaks参数的情况下创建标签。如 中所述?scale_y_continuous,标签可以采用:

之一:

  • NULL 表示无标签 waiver() 用于转换对象计算的默认标签
  • 给出标签的字符向量(必须与中断长度相同)
  • 一个将中断作为输入并返回标签作为输出的函数

创建示例函数很简单:

(function(l) {paste0(round(l/1e6,1),"m")})(5e6)
"5m"
Run Code Online (Sandbox Code Playgroud)

因此,解决方案可能是:

ggplot(as.data.frame(list(x = c(0, 200,100), y = c(7500000,10000000,2000000))), 
       aes(x = x, y = y)) +
    geom_point() +
    expand_limits( x = c(0,NA), y = c(0,NA)) +
    scale_y_continuous(labels = function(l) {
        paste0(round(l/1e6,1),"m")
    })
Run Code Online (Sandbox Code Playgroud)

无需指定breaks参数。

结果


在英国,我们倾向于使用小m


Tun*_*ung 7

我认为您可以手动设置labelsbreaks

library(ggplot2)

ylab <- c(2.5, 5.0, 7.5, 10)

ggplot(as.data.frame(list(x = c(0, 200, 100), y = c(7500000, 10000000, 2000000))), 
       aes(x = x, y = y)) +
  geom_point() +
  expand_limits(x = c(0, NA), y = c(0, NA)) +
  scale_y_continuous(labels = paste0(ylab, "M"),
                     breaks = 10^6 * ylab
  )
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.2.1.9000)创建于2018-10-01