【问题标题】:Label minimum and maximum of scale fill gradient legend with text: ggplot2用文本标记比例填充渐变图例的最小值和最大值:ggplot2
【发布时间】:2014-08-07 13:47:13
【问题描述】:

我在ggplot2 中创建了一个使用scale_fill_gradientn 的情节。我想在比例图例的最小值和最大值处添加文本。例如,在图例最小值处显示“Minimum”,在图例最大值处显示“Maximum”。有些帖子使用离散填充并添加带有数字而不是文本的标签(例如here),但我不确定如何使用labels 功能和scale_fill_gradientn 仅在最小值和最大值处插入文本。目前我很容易出错:

Error in scale_labels.continuous(scale, breaks) : 
Breaks and labels are different lengths

这种类型的比例/填充是否可以在 ggplot2 中使用此文本标签?

# The example code here produces an plot for illustrative purposes only.
# create data frame, from ggplot2 documentation
df <- expand.grid(x = 0:5, y = 0:5) 
df$z <- runif(nrow(df))

#plot
ggplot(df, aes(x, y, fill = z)) + geom_raster() + 
scale_fill_gradientn(colours=topo.colors(7),na.value = "transparent")

【问题讨论】:

标签: r ggplot2 label legend fill


【解决方案1】:

对于scale_fill_gradientn(),您应该提供两个参数:breaks=labels=,长度相同。使用参数limits=,您可以将颜色条扩展到您需要的最小值和最大值。

ggplot(df, aes(x, y, fill = z)) + geom_raster() + 
      scale_fill_gradientn(colours=topo.colors(7),na.value = "transparent",
                           breaks=c(0,0.5,1),labels=c("Minimum",0.5,"Maximum"),
                           limits=c(0,1))

【讨论】:

  • 这个答案还有效吗?我使用以下命令无济于事。最小值和最大值不会显示在颜色条上。这是我的代码scale_fill_gradientn(colours=pal(100), breaks=breaks, limits=lim, labels=breaks, guide = guide_colorbar(title=expression(paste('hr', sep="")), title.position = "right", title.vjust = 0.8, barwidth = 75))
  • 代码仍然有效。无法检查您的代码,因为它不可重现。
  • @Gandalf,一定是某个时候发生了重大变化。 limits 用于转换比例现在它是一个硬标准,外面的每个值都将成为 NA-Color。试试df$z &lt;- runif(nrow(df)) * 9
  • NA 值和限制的问题可以使用更多的自动化来处理...对于一个建议如何 - see my answer
【解决方案2】:

User Didzis Elfert's answer 在我看来略微缺乏“自动化”(但它当然指向问题的核心 +1 :)。 这里有一个以编程方式定义数据的最小值和最大值的选项。

优点:

  • 您不再需要对值进行硬编码(这很容易出错)
  • 您不需要硬编码限制(这也容易出错)
  • 传递命名向量:您不需要标签参数(手动将标签映射到值容易出错)。
  • 作为副作用,您将避免“标签不匹配/中断”问题
library(ggplot2)
foo <- expand.grid(x = 0:5, y = 0:5)
foo$z <- runif(nrow(foo))

myfuns <- list(Minimum = min, Mean = mean, Maximum = max)

ls_val <- unlist(lapply(myfuns, function(f) f(foo$z)))

# you only need to set the breaks argument! 
ggplot(foo, aes(x, y, fill = z)) +
  geom_raster() +
  scale_fill_gradientn(
    colours = topo.colors(7),
    breaks = ls_val
  )


# You can obviously also replace the middle value with sth else

ls_val[2] <- 0.5
names(ls_val)[2] <- 0.5

ggplot(foo, aes(x, y, fill = z)) +
  geom_raster() +
  scale_fill_gradientn(
    colours = topo.colors(7),
    breaks = ls_val
  )

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 2017-09-26
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多