ggplot2 和对数刻度不显示值 = 1
ggplot2 and log scale don't show values = 1
我想绘制一个带有对数刻度 y 轴的图表:
data <- data.frame(x = seq_len(5), y = c(2,1,100,500,30))
ggplot(data) + aes(x,y) + geom_col() + scale_y_log10()
但是因为水平轴总是在 y = 1 处与垂直轴相交,所以永远不会绘制 y = 1 的柱状图。
我知道 log(1) = 0,但我可以将绘图基数设置为 0.1 以使条形图从 1 以下开始吗?
另一种解决方案是将条形图的底部放在 -Inf
,这样 log10(1)
仍然会显示。这有点棘手,因为您必须将条形重新参数化为矩形并让 geom 理解 -Inf
是在缩放变换之后。
library(ggplot2)
data <- data.frame(x = seq_len(5), y = c(2,1,100,500,30))
ggplot(data) +
geom_rect(
aes(xmin = x - 0.45, xmax = x + 0.45,
ymin = stage(1, after_scale = -Inf), ymax = y)
) +
scale_y_log10()
由 reprex package (v0.3.0)
于 2020-11-03 创建
你不能只将 y 的值乘以 10 而将标签除以相同的数量吗?
ggplot(data) + aes(x, y * 10) + geom_col() +
scale_y_log10(labels = function(x) x/10, name = "y")
您可以对直方图执行相同的操作:
set.seed(2)
ggplot(data.frame(x = rnorm(1000)), aes(x)) +
geom_histogram(aes(y = ..count.. * 10), color = "black", fill = "gold") +
scale_y_log10(labels = function(x) x/10, name = "count")
我想绘制一个带有对数刻度 y 轴的图表:
data <- data.frame(x = seq_len(5), y = c(2,1,100,500,30))
ggplot(data) + aes(x,y) + geom_col() + scale_y_log10()
但是因为水平轴总是在 y = 1 处与垂直轴相交,所以永远不会绘制 y = 1 的柱状图。
我知道 log(1) = 0,但我可以将绘图基数设置为 0.1 以使条形图从 1 以下开始吗?
另一种解决方案是将条形图的底部放在 -Inf
,这样 log10(1)
仍然会显示。这有点棘手,因为您必须将条形重新参数化为矩形并让 geom 理解 -Inf
是在缩放变换之后。
library(ggplot2)
data <- data.frame(x = seq_len(5), y = c(2,1,100,500,30))
ggplot(data) +
geom_rect(
aes(xmin = x - 0.45, xmax = x + 0.45,
ymin = stage(1, after_scale = -Inf), ymax = y)
) +
scale_y_log10()
由 reprex package (v0.3.0)
于 2020-11-03 创建你不能只将 y 的值乘以 10 而将标签除以相同的数量吗?
ggplot(data) + aes(x, y * 10) + geom_col() +
scale_y_log10(labels = function(x) x/10, name = "y")
您可以对直方图执行相同的操作:
set.seed(2)
ggplot(data.frame(x = rnorm(1000)), aes(x)) +
geom_histogram(aes(y = ..count.. * 10), color = "black", fill = "gold") +
scale_y_log10(labels = function(x) x/10, name = "count")