r - R 中使用 ggplot2 进行对数缩放

标签 r ggplot2 scaling

我正在尝试使用 ggplot2 创建图表。有几个非常小的值要显示,还有一些较大的值。我想使用对数缩放以适当的方式显示所有这些。这就是我所做的:

plotPointsPre <- ggplot(data = solverEntries, aes(x = val, y = instance, 
                                                  color = solver, group = solver))

...

finalPlot <- plotPointsPre + coord_trans(x = 'log10') + geom_point() +
xlab("costs") + ylab("instance")

这是结果:

This

与没有coord_trans(x = 'log10')时的情况相同。

但是,如果我将它与 y 轴一起使用:

it works

如何实现 x 轴上的对数缩放?另外,这与x轴无关,如果我交换x和y的值,那么它会在x轴上起作用,而不再在y轴上起作用。所以显示的值似乎存在一些问题。有人知道如何解决这个问题吗?

编辑 - 这是 solverEntries 中包含的使用数据:

solverEntries <- data.frame(instance = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20),
                 solver = c(4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1),
                 time = c(1, 24, 13, 6, 1, 41, 15, 5, 1, 26, 16, 5, 1, 39, 7, 4, 1, 28, 11, 3, 1, 31, 12, 3, 1, 38, 20, 3, 1, 37, 10, 4, 1, 25, 11, 3, 1, 32, 18, 4, 1, 27, 21, 3, 1, 23, 22, 3, 1, 30, 17, 2, 1, 36, 8, 3, 1, 37, 19, 4, 1, 40, 21, 3, 1, 29, 11, 4, 1, 33, 10, 3, 1, 34, 9, 3, 1, 35, 14, 3),
                 val = c(6553.48, 6565.6, 6565.6, 6577.72, 6568.04, 7117.14, 6578.98, 6609.28, 6559.54, 6561.98, 6561.98, 6592.28, 6547.42, 7537.64, 6549.86, 6555.92, 6546.24, 6557.18, 6557.18, 6589.92, 6586.22, 6588.66, 6588.66, 6631.08, 6547.42, 7172.86, 6569.3, 6582.6, 6547.42, 6583.78, 6547.42, 6575.28, 6555.92, 6565.68, 6565.68, 6575.36, 6551.04, 6551.04, 6551.04, 6563.16, 6549.86, 6549.86, 6549.86, 6555.92, 6544.98, 6549.86, 6549.86, 6561.98, 6558.36, 6563.24, 6563.24, 6578.98, 6566.86, 7080.78, 6570.48, 6572.92, 6565.6, 7073.46, 6580.16, 6612.9, 6557.18, 7351.04, 6562.06, 6593.54, 6547.42, 6552.3, 6552.3, 6558.36, 6553.48, 6576.54, 6576.54, 6612.9, 6555.92, 6560.8, 6560.8, 6570.48, 6566.86, 6617.78, 6572.92, 6578.98))

最佳答案

当前形式的数据不是日志分布的——大多数 val 约为 6500,有些高出 10%。如果您想拉伸(stretch)数据,可以使用 scales::trans_new() 进行自定义转换,或者这里有一个更简单的版本,只需减去基线值即可使对数转换变得有用。减去 6500 后,小值将映射到 50 左右,大值将映射到 1000 左右,这是对数刻度更合适的范围。然后我们对中断应用相同的转换,以便标 checkout 现在正确的位置。 (即标签 6550 映射到映射到 6550 - 6500 = 50 的数据)

如果您希望使基础值更易于区分,但代价是扭曲值之间的基础比例,则此方法会有所帮助。您也许可以通过选择有用的休息时间并用缩放统计数据标记它们来帮助解决此问题,例如

7000 超过分钟+7%

my_breaks <- c(6550, 6600, 6750, 7000, 7500)
baseline = 6500

library(ggplot2)
ggplot(data = solverEntries, 
       aes(x = val - baseline, y = instance, 
           color = solver, group = solver)) +
  geom_point() +
  scale_x_log10(breaks = my_breaks - baseline,
                labels = my_breaks, name = "val")

enter image description here

关于r - R 中使用 ggplot2 进行对数缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56050334/

相关文章:

r - ggplot geom_bar() 填充绘图上的不着色条

image-processing - 裁剪、缩放、调整大小和更改图像的纵横比之间的区别?

r - 如何在分配命名元素期间替换元素的名称?

r - 由于@example,Check()-ing 包失败

R 按组小鼠插补 - mouse.impute.bygroup

r - 将功能区添加到 R 中的线图

r - 查找向量中 n 个最常见的值

r - 在 R 中绘制顺序(时间序列)数据的子集

java - 图像未在 Android 中重新缩放比例

android - 将 ImageView ScaleType 设置为 "center"无法正常工作