使用ggplot2仅将一个轴转换为log10比例

时间:2011-01-15 12:07:46

标签: r ggplot2 boxplot scaletransform

我有以下问题:我想在箱线图上可视化离散和连续变量,其中后者具有一些极高的值。这使得boxplot毫无意义(图表的点甚至“正文”太小),这就是为什么我想在log10范围内显示它。我知道我可以忽略可视化中的极值,但我并不打算这样做。

让我们看一个钻石数据的简单例子:

m <- ggplot(diamonds, aes(y = price, x = color))

alt text

问题在这里并不严重,但我希望你能想象为什么我希望以log10的比例看到这些值。我们来试试吧:

m + geom_boxplot() + coord_trans(y = "log10")

alt text

正如您所看到的那样,y轴是log10缩放并且看起来很好但是x轴存在问题,这使得绘图非常奇怪。

scale_log不会出现问题,但这不是我的选项,因为我不能以这种方式使用自定义格式化程序。 E.g:

m + geom_boxplot() + scale_y_log10() 

alt text

我的问题:有没有人知道在y轴上使用log10比例绘制箱线图的解决方案,标签可以使用formatter函数自由格式化,如thread


根据答案和评论编辑问题以帮助回答者:

我真正追求的是:一个log10转换轴(y)没有科学标签。我想将其标记为美元(formatter=dollar)或任何自定义格式。

如果我尝试@ hadley的建议,我会收到以下警告:

> m + geom_boxplot() + scale_y_log10(formatter=dollar)
Warning messages:
1: In max(x) : no non-missing arguments to max; returning -Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
3: In max(x) : no non-missing arguments to max; returning -Inf

y轴标签不变:

alt text

4 个答案:

答案 0 :(得分:25)

最简单的方法是给formatter参数指定日志函数的名称:

m + geom_boxplot() + scale_y_continuous(formatter='log10')

编辑: 或者如果你不喜欢它,那么其中任何一个似乎都会给出相同的结果:

m <- ggplot(diamonds, aes(y = price, x = color), log="y"); m + geom_boxplot() 
m <- ggplot(diamonds, aes(y = price, x = color), log10="y"); m + geom_boxplot()

EDIT2&amp; 3: 进一步的实验(在丢弃试图成功地在记录值前面加上“$”符号的那个之后):

fmtExpLg10 <- function(x) paste(round_any(10^x/1000, 0.01) , "K $", sep="")
ggplot(diamonds, aes(color, log10(price))) + 
 geom_boxplot() + 
 scale_y_continuous("Price, log10-scaling", formatter = fmtExpLg10)

alt text

注意在2017年中期添加了关于包语法更改的评论:

  

scale_y_continuous(formatter ='log10')现在是scale_y_continuous(trans ='log10')(ggplot2 v2.2.1)

答案 1 :(得分:13)

我有一个类似的问题,这个尺度对我来说就像一个魅力:

breaks = 10**(1:10)
scale_y_log10(breaks = breaks, labels = comma(breaks))

因为你想要中间级别(10 ^ 3.5),你需要调整格式:

breaks = 10**(1:10 * 0.5)
m <- ggplot(diamonds, aes(y = price, x = color)) + geom_boxplot()
m + scale_y_log10(breaks = breaks, labels = comma(breaks, digits = 1))

执行::

enter image description here

答案 2 :(得分:2)

scale_y_log10trans_breakstrans_formatannotation_logticks()一起使用的另一种解决方案

library(ggplot2)

m <- ggplot(diamonds, aes(y = price, x = color))

m + geom_boxplot() +
  scale_y_log10(
    breaks = scales::trans_breaks("log10", function(x) 10^x),
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  ) +
  theme_bw() +
  annotation_logticks(sides = 'lr') +
  theme(panel.grid.minor = element_blank())

答案 3 :(得分:0)

我想我最终通过在可视化之前对数据进行一些手动转换来获得它:

d <- diamonds
# computing logarithm of prices
d$price <- log10(d$price)

然后设计一个格式化程序,以便稍后计算“返回”对数数据:

formatBack <- function(x) 10^x 
# or with special formatter (here: "dollar")
formatBack <- function(x) paste(round(10^x, 2), "$", sep=' ') 

用给定的格式化器绘制图:

m <- ggplot(d, aes(y = price, x = color))
m + geom_boxplot() + scale_y_continuous(formatter='formatBack')

alt text

对不起,社区为您打扰我之前可以解决的问题!有趣的是:我一个月前努力使这个情节工作,但没有成功。在问到这里之后,我明白了。

无论如何,感谢@DWin的动力!