ggplot2:space 轴在等距值之间不均匀地刻度
ggpot2: space axis ticks unevenly between equidistant values
我已经搜索过 SO 和其他在线资源,但无济于事。
有没有办法缩放轴,使 z 分数更好地反映从 0 到 1 和从 1 到 2(或任何其他等距分数)的实际差异?
如果我有一个 x 轴,其 z 分数范围从 -3 到 3 并且轴刻度在每个整数之间,有没有办法让那些更接近 0 的轴刻度比那些轴刻度更小更远?
示例:
-3 -2 -1 0 1 2 3
|----------|------|--|--|------|----------|
我是否遗漏了一些轴缩放方法,它既接受中断作为值,也接受中断相对于整个比例的位置?
编辑:
也许不完全是代表,但这是数据的结构和可视化的基本方法:
df <-
data.frame(
metric = c('metric1', 'metric2', 'metric3'),
z_score = c(2, -1.5, 2.8)
)
df %>%
ggplot(aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
ylim(-4,4)
上面的代码生成了一个图,其中 z_score 轴具有均匀间隔的中断,而我希望中断 "pulled" 接近零,就像我在上面尝试绘制的那样。
你描述的好像是一个模数变换,但我不知道如何选择正确的参数来得到你想要的精确变换。
这是一个例子:
library(ggplot2)
library(scales)
df <- data.frame(
metric = c('metric1', 'metric2', 'metric3'),
z_score = c(2, -1.5, 2.8)
)
ggplot(df, aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
scale_y_continuous(trans = modulus_trans(2),
limits = c(-4, 4),
breaks = c(-3:3))
由 reprex package (v0.3.0)
于 2020-05-28 创建
技巧是使用新的 trans
formation 对象。 scales::
中已经定义了几个,我发现最接近的(虽然在某种意义上是相反的)是:
ggplot(df, aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
scale_y_continuous(trans=scales::pseudo_log_trans(0.2, 2),
limits = c(-3, 3), breaks = -3:3)
但是我认为你想要的是相反的扩展。由于看到 pseudo_log
相反的一种方法是 pseudo_exp
,而我没有找到,这里是一个尝试:
pseudo_exp_trans <- function(pow = 2) {
scales::trans_new(
"pseudo_exp",
function(x) sign(x) * abs(x^pow),
function(x) sign(x) * abs(x)^(1/pow))
}
ggplot(df, aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
scale_y_continuous(trans=pseudo_exp_trans(),
limits = c(-3, 3), breaks = -3:3)
只需使用 pow=
参数即可在轴上找到您想要的增长率。
我已经搜索过 SO 和其他在线资源,但无济于事。
有没有办法缩放轴,使 z 分数更好地反映从 0 到 1 和从 1 到 2(或任何其他等距分数)的实际差异?
如果我有一个 x 轴,其 z 分数范围从 -3 到 3 并且轴刻度在每个整数之间,有没有办法让那些更接近 0 的轴刻度比那些轴刻度更小更远?
示例:
-3 -2 -1 0 1 2 3
|----------|------|--|--|------|----------|
我是否遗漏了一些轴缩放方法,它既接受中断作为值,也接受中断相对于整个比例的位置?
编辑:
也许不完全是代表,但这是数据的结构和可视化的基本方法:
df <-
data.frame(
metric = c('metric1', 'metric2', 'metric3'),
z_score = c(2, -1.5, 2.8)
)
df %>%
ggplot(aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
ylim(-4,4)
上面的代码生成了一个图,其中 z_score 轴具有均匀间隔的中断,而我希望中断 "pulled" 接近零,就像我在上面尝试绘制的那样。
你描述的好像是一个模数变换,但我不知道如何选择正确的参数来得到你想要的精确变换。
这是一个例子:
library(ggplot2)
library(scales)
df <- data.frame(
metric = c('metric1', 'metric2', 'metric3'),
z_score = c(2, -1.5, 2.8)
)
ggplot(df, aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
scale_y_continuous(trans = modulus_trans(2),
limits = c(-4, 4),
breaks = c(-3:3))
由 reprex package (v0.3.0)
于 2020-05-28 创建技巧是使用新的 trans
formation 对象。 scales::
中已经定义了几个,我发现最接近的(虽然在某种意义上是相反的)是:
ggplot(df, aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
scale_y_continuous(trans=scales::pseudo_log_trans(0.2, 2),
limits = c(-3, 3), breaks = -3:3)
但是我认为你想要的是相反的扩展。由于看到 pseudo_log
相反的一种方法是 pseudo_exp
,而我没有找到,这里是一个尝试:
pseudo_exp_trans <- function(pow = 2) {
scales::trans_new(
"pseudo_exp",
function(x) sign(x) * abs(x^pow),
function(x) sign(x) * abs(x)^(1/pow))
}
ggplot(df, aes(x = metric, y = z_score)) +
geom_col() +
coord_flip() +
scale_y_continuous(trans=pseudo_exp_trans(),
limits = c(-3, 3), breaks = -3:3)
只需使用 pow=
参数即可在轴上找到您想要的增长率。