【问题标题】:Transforming the y-axis without changing raw data in ggplot2在不更改 ggplot2 中的原始数据的情况下转换 y 轴
【发布时间】:2017-07-27 20:28:56
【问题描述】:

我有一个关于如何在 ggplot2 中转换 y 轴的问题。我的情节现在有两条线和一个散点图。对于散点图,我对零附近的区域非常感兴趣。有没有办法扩大0%到5%之间的空间,缩小20%到30%之间的空间?

我曾尝试使用coord_trans(y = "log10") 转换为日志形式。但是在这种情况下,我有很多负值,所以如果我想使用 sqrt 或 log,负值将被删除。你有什么建议吗?

数据点示例:

df1 = data.frame(y = runif(200,min = -1, max = 1))
df1 = data.frame( x= seq(1:200), y = df1[order(abs(df1$y)),])

ggplot(df1) + 
    geom_point(colour = "black",aes(x,y) ,size = 0.1) 

我希望在 0% 到 5% 之间留出更多空间,在 5% 到 30% 之间留出更少空间。

我尝试使用trans_new() 来转换坐标轴。

eps <- 1e-8

tn <- trans_new("logpeps",
                function(x) (x+eps)^(3),
                function(y) ((y)^(1/3) ),
                domain=c(- Inf, Inf)
              )

ggplot(df1)+ geom_point(colour = "black",aes(x,y) ,size = 0.1) + 
  # xlab("Observations sorted by PD in v3.1") + ylab("Absolute PD difference ") + 
  # ggtitle("Absolute PD for RiskCalc v4.0 relative to v3.1") +

  scale_x_continuous(breaks = seq(0, round(rownum/1000)*1000, by = round(rownum/100)*10)) + 
  scale_y_continuous(limits = c(-yrange,yrange),breaks = c(-breaksY,breaksY),
                     sec.axis = sec_axis(~.,breaks = c(-breaksY[2:length(breaksY)],breaksY), labels = scales:: percent
                                        )) +
#   geom_line(data = df, aes(x,y[,3], colour = "blue"),size = 1) +  
#   geom_line(data = ds,aes(xval, yval,colour = "red"),size = 1) + 
  coord_trans(y = tn) +
  scale_color_discrete(name = element_blank())

但它将情节压缩到中心,这与我想要的相反。然后我尝试使用 y = y^3,但它显示了一个

错误:zero_range(范围)

【问题讨论】:

  • 您可以从过滤掉所有
  • @Mako212 有一个很好的观点。我不确定在数据可视化中通常使用或推荐具有两个不同范围的刻度的轴。考虑将 y 轴的限制设置为 10% 和 -10%
  • @AlexP 我强烈建议避免在同一张图表上使用不同的轴刻度(假设您正在谈论对红色和蓝色使用不同的范围),因为这表明两者之间存在错误的等效/比较同一图表上的一组值。只需将图表限制在 +/- 10% 就可以了
  • 您可以在自定义比例/轴转换stackoverflow.com/questions/38333603/…中使用对数模数转换L(x) = sign(x) * log(|x| + 1)
  • 还有!是否可以删除高于 30% 或低于 -30% 的空间?这是一种浪费。

标签: r ggplot2


【解决方案1】:

尝试对 y 值进行立方根变换:

aes(y=yVariable^(1/3))

或使用trans_new() 定义新的转换(例如立方根,带有令人愉悦的中断和标签)。

【讨论】:

  • 使用 trans_new() 以立方根变换 y 轴将绘图压缩到与我想要的相反的 x 轴。所以我尝试将 y 轴转换为立方体,但它只显示错误消息:缺少 TRUE/FALSE 值。
  • hmmm... 哦,是的,我想既然您使用的是百分比,那么根会做一些有趣的事情。 . .在上面的 cmets 中尝试对数模数,并将 y 轴限制为 +/- 10%
【解决方案2】:

几个想法:

您可以像这样删除绘图的空白边缘:

scale_y_continuous(expand = c(0,0))

如果您想尝试日志转换,只需:

scale_y_log10()

如果你想聚焦窗口:

scale_y_continuous(limits=c(-.15,.15), expand=c(0,0))

还可以考虑添加theme_bw() 以获得更简洁的外观

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多