【问题标题】:How can I make ggvis legend match the graph?如何使 ggvis 图例与图表匹配?
【发布时间】:2016-04-19 13:18:35
【问题描述】:

我创建了一个函数,它使用 ggvis 绘制我们定期查看的一些数据的图表。在此,最后一组“Overall”被覆盖,显示为宽度为 3 的黑线,而不是默认值。不幸的是,我为覆盖默认值而采取的步骤没有显示在图例中。我不确定该怎么做才能完成这项工作。我曾尝试专门调用 add_legend,但没有成功。

用于生成它的代码是(也带有一些随机数据):

CAL_DATE = seq(as.Date("10/1/2015", format = "%m/%d/%Y"),
               as.Date("3/31/2016", format = "%m/%d/%Y"), by = 1)
CAL_DATE = as.POSIXct(CAL_DATE)
a = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE),
                                       5, 500),0), CT_DS = rep("A",length(CAL_DATE))))
b = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE),
                                       4, 540),0), CT_DS = rep("B", length(CAL_DATE))))
Overall = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE),
                                             10, 475),0), CT_DS = rep("Overall", length(CAL_DATE))))
a$CAL_DATE = CAL_DATE
b$CAL_DATE = CAL_DATE
Overall$CAL_DATE = CAL_DATE

data = rbind(a, b, Overall)

plot_ma = function(x){
        x %>%
                group_by(CT_DS) %>%
                ggvis(~CAL_DATE, ~ma_AHT, stroke = ~CT_DS) %>%
                layer_lines() %>%
                filter(CT_DS == "Overall") %>%
                layer_lines(stroke := "black", strokeWidth := 3) %>%
                set_options(renderer = "canvas") %>%
                add_legend("stroke", title = "~ CT") %>%
                add_axis("x", title = "Date", title_offset = 60,
                         properties = axis_props(
                                 labels = list(
                                         angle = -50,
                                         align = "right",
                                         baseline = "middle"
                                 ))) %>%
                add_axis("y", title = "M.A. AHT (sec)")
}
plot_ma(data)

这应该会生成如下所示的内容。我唯一关心的是如何使图例显示“整体”也为黑色。

【问题讨论】:

  • 你能添加一个小的示例数据集吗?
  • 如果Overall 总是最后一个,我想你可以通过range 定义scale_nominal 中的颜色。在您的简单示例中,它类似于scale_nominal("stroke", range = c("blue", "orange", "black"))。对于更多组,您可以根据您拥有的组数制作颜色矢量或从样本中提取颜色,然后在末尾附加“黑色”。
  • 数据集之间的组数可能会有很大差异。您能否让我更深入地了解如何从样本中提取颜色?我查看了一个 ggvis 对象,试图找到它可能在哪里,但没有成功。

标签: r ggvis


【解决方案1】:

使用scale_nominal 并提供range 允许您在图形和图例中设置颜色。

在您的简单示例中,这就像添加一样简单,例如, scale_nominal("stroke", range = c("blue", "orange", "black")) 到您的绘图代码的末尾。

听起来组的数量可能会有所不同。但是,Overall 组总是按顺序排在最后(或者您通过 factor 将其设置为最后一个),您可以使用与上面类似的内容并将其作为您函数的一部分。在这种情况下,您需要建立一个您喜欢(并且不包含黑色)的调色板,该调色板为您的所有组提供足够的颜色。

在这里,我将采用Cookbook for R 提供的调色板之一,具有 8 种不同的颜色。

cbPalette = c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

我们可以通过使用分组因子的级别数从调色板中提取特定数据集所需的颜色数。所需颜色的数量是负 1,因为最后一种颜色总是黑色。

这是计算需要着色的组数减1的一种方法。

ncol = nlevels(data[["CT_DS"]]) - 1

此信息可用于从cbPalette 中提取前 1 到“层数减 1”的颜色。

pal = cbPalette[1:ncol]

这可用于scale_nominalrange 参数,将"black" 附加到向量的末尾。

scale_nominal("stroke", range = c(pal, "black"))

这个过程很容易添加到你的函数中。

plot_ma = function(x){
    ncol = nlevels(x[["CT_DS"]]) - 1
    pal = cbPalette[1:ncol]
    x %>%
        group_by(CT_DS) %>%
        ggvis(~CAL_DATE, ~ma_AHT, stroke = ~CT_DS) %>%
        layer_lines() %>%
        filter(CT_DS == "Overall") %>%
        layer_lines(stroke := "black", strokeWidth := 3) %>%
        set_options(renderer = "canvas") %>%
        add_legend("stroke", title = "~ CT") %>%
        add_axis("x", title = "Date", title_offset = 60,
                properties = axis_props(
                    labels = list(
                        angle = -50,
                        align = "right",
                        baseline = "middle"
                    ))) %>%
        add_axis("y", title = "M.A. AHT (sec)") %>%
        scale_nominal("stroke", range = c(pal, "black"))
}
plot_ma(data)

【讨论】:

  • 它就像你描述的@aosmith一样工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 2021-05-05
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
相关资源
最近更新 更多