3

我在 y 格式范围内遇到了一些问题。当我scale_y_log10()在我的情节中使用时,它决定使用比例 0.1、10、1000 是这样做的方法。我真的需要将其显示为1e-1, 1e1, 1e3math_format如果没有我需要知道的格式,帮助页面就没有帮助。

我能回答的我都会回答。

4

3 回答 3

9

问题在于 R 使用了一种尚未被充分理解的惩罚机制来决定是以正常计数法还是科学计数法打印。这是由 决定的options( scipen )

该值表示惩罚 R 适用于以科学计数法与定点打印所需的字符数,因此options(scipen = 3)意味着R将打印所需的字符数加上 31e2并将其与它的字符数进行比较需要打印等效的定点并打印具有较少字符数的数字(因此在这种情况下1e2= 3个字符,+ 3个惩罚= 6,而100等于3个字符,因此100被打印。要解决您的示例,只需设置options(scipen = -10)为始终支持打印定点上的科学记数法。所以(使用@PeterB的例子)你可以使用scipen它应该让你不用担心手动中断设置......

options(scipen = -10)
ggplot(data=subset(movies, votes > 1000)) +
  aes(x = rating, y = votes / 10000) +
  geom_point()

在此处输入图像描述

于 2013-09-03T20:14:43.970 回答
4

实现您所要求的最简单的方法是自动限制和中断,并且没有副作用:

library(ggplot2)
library(MASS)
library(scales)
ggplot(data=subset(movies, votes > 1000)) +
  aes(x = rating, y = votes / 10000) +
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x, n=3), 
                labels = trans_format("log10")) +
  geom_point()

我更喜欢使用十次方的上标,隐藏次要网格,并添加根据日志间隔的刻度。这也很容易实现:

ggplot(data=subset(movies, votes > 1000)) +
  aes(x = rating, y = votes / 10000) +
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x, n=3), 
               labels = trans_format("log10", math_format(10^.x))) +
  theme(panel.grid.minor = element_blank()) +
  annotation_logticks(sides="l") + 
  geom_point()

上面的代码改编自 annotation_logticks 帮助annotation_logticks中的示例。调整精确格式有很大的灵活性。

于 2013-09-04T08:21:20.200 回答
4

可以使用as的breaksandlabels参数scale_y_log10

library(ggplot2)

ggplot(data=subset(movies, votes > 1000)) +
  aes(x = rating, y = votes / 10000) +
  scale_y_log10(breaks = c(0.1, 1, 10), labels = expression(10^-1, 10^0, 10^1)) +
  geom_point()

这可能不是一个优雅的解决方案,但如果您只有有限数量的地块,它就可以工作。

于 2013-09-03T19:53:10.567 回答