r - 如何以 sqrt(x) 格式格式化 x 轴刻度标签?
问题描述
我正在研究ggplot2的coord_trans()的例子:
library(ggplot2)
library(scales)
set.seed(4747)
df <- data.frame(a = abs(rnorm(26)),letters)
plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + coord_trans(x = "log10")
plot + coord_trans(x = "sqrt")
我修改了plot + coord_trans(x = "log10")
以下代码并得到了我的预期:
plot + scale_x_log10(breaks=trans_breaks("log10", function(x) 10^x),
labels=trans_format("log10", math_format(10^.x)))
我将代码修改plot + coord_trans(x = "sqrt")
如下,得到一个奇怪的 x 轴:
plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) sqrt(x)),
labels=trans_format("sqrt", math_format(.x^0.5)))
我该如何解决这个问题?
解决方案
我明白你为什么说这是一个奇怪/可怕的轴。even的文档trans_breaks
在其第一行中警告您:
这些通常不会产生非常有吸引力的休息时间。
为了使它不那么吸引人,我会使用round(,2)
这样我的轴标签只有 2 个小数点而不是默认的 8 或 9 - 使轴混乱。然后我会设置一个合理的范围,比如你的情况是 0 到 5 ( c(0,5)
)。
最后,您可以n
在trans_breaks
调用中指定轴的刻度数。
因此,将它们放在一起,您可以按照以下格式格式化 x 轴及其刻度标签scale_x_sqrt(x)
:
plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) round(sqrt(x),2), n=5)(c(0, 5)))
被c(0,5)
传递给pretty()
,一个鲜为人知的 Base R 函数。从文档pretty
中,执行以下操作:
计算大约 n+1 个等距“圆形”值的序列,这些值覆盖 x 中的值范围。
pretty(c(0,5))
在我们的例子中简单地产生[1] 0 1 2 3 4 5
。
您甚至可以通过更改参数来微调您的轴。这里代码使用 3 个小数点 ( round(x,3)
),我们要求 3 个刻度n=3
:
plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) round(sqrt(x),3), n=3)(c(0, 5)))
根据 OP 的附加评论进行编辑:要获得整数值,floor()
或round(x,0)
工作,所以下面的代码:
plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) round(sqrt(x),0), n=5)(c(0, 5)))
推荐阅读
- java - 在 RecyclerView 内的 ListViews 中显示项目
- python - 如何在 django CBV 中显示之前检查对象状态
- ios - 如何修复 VsTac 任务意外失败
- vue.js - 触发其他事件时如何删除规则消息
- php - 在 WooCommerce 中为特定产品添加额外的添加到购物车按钮
- swagger - swagger.yaml:如何生成 `InputStreamResource` 类型的 ResponseEntity。
- android - 选择前置摄像头时应用程序崩溃,如何解决?
- c# - 从数据库中检索数据时出现空引用异常
- javascript - 动态打开和关闭 antd/react 折叠组件
- laravel - 使用自定义请求类代替 NovaRequest (FormRequest) 在 Laravel Nova 中创建资源很热门?