【问题标题】:Secondary / Dual axis - ggplot次要/双轴 - ggplot
【发布时间】:2016-04-16 21:57:30
【问题描述】:

我打开这个问题有三个原因:首先,重新打开与ggplot的双轴讨论。其次,询问是否有一种不折磨人的通用方法来做到这一点。最后就变通方法寻求您的帮助。

我意识到关于如何向 ggplot 添加辅助轴有多个讨论和问题。这些通常会得出以下两个结论之一:

  1. 这很糟糕,不要这样做:Hadley Wickham 回答了同样的问题 here,得出的结论是这是不可能的。他有一个很好的论点,即“使用单独的 y 尺度(不是相互转换的 y 尺度)从根本上是有缺陷的”

  2. 如果你坚持,那就过分复杂化你的生活并使用网格:例如herehere


但是,这里有一些我经常遇到的情况,在这些情况下,可视化将极大地受益于双轴。我抽象了下面的概念。

  1. 绘图很宽,因此复制右侧的 y 轴(或顶部的 x 轴)将有助于解释。 (我们都偶然发现了其中一个需要在屏幕上使用标尺的绘图,因为轴太远了)

  2. 我需要添加一个新轴,它是对原始轴的转换(例如:百分比、分位数……)。 (我目前面临一个问题。下面的可重现示例)

  3. 最后,添加 分组/元信息:我在使用多级分类数据时偶然发现了这一点,(例如:Categories = {1,2,x, y,z},它们被“元划分”为字母和数字。) 尽管对元级别进行颜色编码并添加图例甚至刻面解决了问题,但使用辅助轴,用户不需要将条形的颜色与图例的颜色匹配。


一般性问题:考虑到新的可扩展性功能ggplot 2.0.0,是否有更强大的免折磨方式来实现不使用网格的双轴?

最后一条评论:我完全同意双轴的错误使用可能会产生危险的误导......但是,信息可视化和数据科学一般不就是这种情况吗?



解决问题

目前,我需要一个百分比轴(第二种情况)。我使用annotategeom_hline 作为解决方法。但是,我不能将文本移到主情节之外。 hjust 似乎也不适合我。

可重现的例子:

library(ggplot2)

# Random values generation - with some manipulation : 
maxVal = 500
value = sample(1:maxVal, size = 100, replace = T)
value[value < 400] = value[value < 400] * 0.2
value[value > 400] = value[value > 400] * 0.9


# Data Frame prepartion : 
labels = paste0(sample(letters[1:3], replace = T, size = length(value)), as.character(1:length(value)))
df = data.frame(sample = factor(labels, levels = labels), value = sort(value, decreasing = T))


# Plotting : Adding Percentages/Quantiles as lines  
ggplot(data = df, aes(x = sample, y = value)) + 
  geom_bar(stat = "identity", fill = "grey90", aes(y = maxVal )) + 
  geom_bar(stat = "identity",  fill = "#00bbd4") + 
  geom_hline(yintercept = c(0, maxVal)) + # Min and max values
  geom_hline(yintercept = c(maxVal*0.25, maxVal*0.5, maxVal*0.75), alpha = 0.2) +  # Marking the 25%, 50% and 75% values 
  annotate(geom = "text", x = rep(100,3), y = c(maxVal*0.25, maxVal*0.5, maxVal*0.75), 
           label = c("25%", "50%", "75%"), vjust = 0, hjust = 0.2) +  
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  theme(panel.background = element_blank()) + 
  theme(plot.background = element_blank()) + 
  theme(plot.margin = unit(rep(2,4), units = "lines")) 

【问题讨论】:

  • 如果你真的想要第二个 y 轴,可以使用 latticeExtra
  • @MLavoie ,出于这样一个直截了当的原因,从 ggplot 变为 lattice 有点令人沮丧..
  • 我记得 Hadley 在某处写道,作为主轴转换的辅助轴是可以接受的,他可能会接受添加此类功能的拉取请求。

标签: r ggplot2


【解决方案1】:

回应#1

我们都偶然发现了其中一个需要在屏幕上使用标尺的绘图,因为轴太远了

cowplot.

# Assign your original plot to some variable, `gpv` <- ggplot( ... )
ggdraw(switch_axis_position(gpv, axis="y", keep="y"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多