簡體   English   中英

如何使用ggplot2繪制功率曲線

[英]How to draw a power curve using ggplot2

我想使用ggplot2來顯示一些遵循功率曲線的數據。 之前已經問過這個問題( 將exp / power trend line添加到ggplot中 ),但答案並沒有真正幫助。

一個技巧是使用stat_function()來創建曲線。 但是,我無法使用stat_function()和我的功率曲線來處理對數刻度。

我說明了我的問題。

創建一些示例數據和基礎圖:

library(ggplot2)

x <- 1:100
pwr <- function(x)x^-2.5
dat <- data.frame(x, y = pwr(x))

p <- ggplot(dat, aes(x = x, y = y)) + 
  geom_point()

p + stat_function(fun = pwr)

在此輸入圖像描述

太好了,讓我們使用coord_trans()添加一些logaritmic比例。 除了我的直線不再筆直(正如文檔告訴我期望的那樣)之外,這種方式非常有效。

p + stat_function(fun = pwr) + coord_trans(x = "log10", y = "log10")

在此輸入圖像描述

因此,請使用coord_x_log10()coord_y_log10()再次嘗試,但這會引發錯誤

p + stat_function(fun = pwr) + scale_x_log10() + scale_y_log10()

Error in seq.default(min, max, by = by) : 
  'from' cannot be NA, NaN or infinite

這很可能與我必須調整我的功能以反轉音階效果的事實有關,但我無法弄明白。

我只能用logarithmix x-scale來做到這一點:

p + scale_x_log10() + stat_function(fun = function(x)pwr(10^x))

在此輸入圖像描述

如果我添加scale_y_log10()我不知道如何轉換y值。

我可能錯過了一些基本的東西。 有沒有一種簡單的方法來繪制這條曲線?

把我的評論寫成答案:

主要問題是stat_function的錯誤。 當與軸變換結合使用時,它會根據變換而不是原始值計算y值。 最近在github修復了這個問題。

但是,這不容易看到,因為在計算軸斷裂時發生第一個錯誤,因為錯誤產生了Inf ,零和/或負y值。 您需要設置顯式軸限制以查看實際問題是stat_function

p + stat_function(fun = pwr) + 
  scale_x_log10() + scale_y_log10(limits = c(1e-5, 1))
#Warning message:
#Removed 100 rows containing missing values (geom_path).

結果情節

如果你只改變x軸,那就更明顯了:

p + stat_function(fun = pwr) + 
  scale_x_log10() 

結果情節

如果你不能使用github的ggplot2版本,你可以使用這個:

p + geom_line(data = data.frame(x = seq(min(dat$x), max(dat$x), length.out = 100)),
              aes(y = pwr(x))) + 
  scale_x_log10() + scale_y_log10()

結果情節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM