通常来说,进行图片绘制的时候如果存在数据分布差异过大的情况,我们更倾向于选择坐标系截断(gg.map等)的方式去展示于结论更加相关的信息。但是截断毕竟会损失部分信息,如果想要更加全面地展示,数据转换是一种不错的方式。
原始数据:
p <- ggplot(df, aes(x, y)) +
geom_boxplot() +
xlab(NULL) +
ylab(NULL) +
scale_y_log10(breaks = c(1, 2, 5, 10, 50, 100))
print(p)
scale_y_log10可以将y轴的刻度转换为对数刻度,具体来说是对数底为10的刻度。其作用是使y轴上的数据在对数尺度上均匀分布。
假设有一组数据,其y值分布在1到10000之间,如果使用普通的线性尺度,那么1到100之间的数据点将会非常密集,而1000到10000之间的数据点则会非常稀疏。但如果使用scale_y_log10将y轴转换为对数刻度,那么1到10、10到100、100到1000、1000到10000这些区间在y轴上所占的距离将会相等,从而使得数据在各个数量级上的分布更加均匀,便于观察和分析。
结果如下:
原始数据:
代码:
# 自定义正向变换函数
custom_transform <- function(x) {
ifelse(x <= 100, x, ifelse(x <= 150, 100 + (x - 100) * 0.8,
ifelse(x <= 250, 140 + (x - 150) * 0.6,
ifelse(x <= 350, 220 + (x - 250) * 0.4, x))))
}
# 自定义反向变换函数
custom_inverse <- function(x) {
ifelse(x <= 100, x, ifelse(x <= 140, 100 + (x - 100) / 0.8,
ifelse(x <= 220, 150 + (x - 140) / 0.6,
ifelse(x <= 300, 250 + (x - 220) / 0.4, x))))
}
# 创建自定义转换器对象
custom_trans <- trans_new(
name = "custom",
transform = custom_transform,
inverse = custom_inverse
)
# 绘制图形
ggplot(df, aes(x, y,fill=x)) +
geom_boxplot() +
scale_y_continuous(trans = custom_trans, breaks = c(50, 100, 150, 250, 350))
结果如下:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!