我有一个图表,其中以百万为单位绘制了一些非常大的数字。我的听众不太可能理解科学计数法,因此我希望将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)
我不想重新缩放数据,因为我还将包括带有各个数据点值的标签。
答案 0 :(得分:9)
在秤包中,函数label_number_si()
自动对带有最佳SI前缀的秤进行缩放和标签;对于值≥10e3,“ K”;对于值10e6为“ M”;对于值10e9为“ B”,以及“ T” ≥10e12。
参见here
所以:
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())
答案 1 :(得分:6)
我认为您可以手动设置labels
和breaks
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
)
由reprex package(v0.2.1.9000)于2018-10-01创建
答案 2 :(得分:5)
我发现scales::unit_format()
更具可读性:
library(dplyr)
library(scales)
library(ggplot2)
as.data.frame(
list(x = c(0, 200, 100),
y = c(7500000, 10000000, 2000000))) %>%
mutate(y = y / 10^6) %>%
ggplot(aes(x, y)) +
geom_point() +
expand_limits(x = c(0, NA), y = c(0, NA)) +
scale_y_continuous(labels = unit_format(unit = "M"))
答案 3 :(得分:0)
与使用ggplot2的许多其他情况一样,我认为最简单的方法是在将数据传递到ggplot()函数之前对数据进行处理。我将创建一个新的数据列,其值以百万为单位,如下所示:
library(dplyr)
library(ggplot2)
df <- data.frame(x = c(0, 200,100),
y = c(7500000,10000000,2000000)) %>%
mutate(y_millions = y/1e6)
ggplot(df,
aes(x = x,
y = y_millions)) +
geom_point() +
labs(y = "y (in millions)")
答案 4 :(得分:0)
仅在标度之前添加该函数即可创建标签,而无需指定breaks
参数。如?scale_y_continuous
中所述,标签可以采用:
其中之一:
- 无标签时为NULL转换对象计算的默认标签为waiver()
- 提供标签的字符向量(长度必须与断点相同)
- 该函数以中断作为输入,并返回标签作为输出
创建示例函数很简单:
(function(l) {paste0(round(l/1e6,1),"m")})(5e6)
"5m"
因此解决方案可能是:
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")
})
无需指定breaks
参数。
在英国,我们倾向于使用较小的 m 。