【问题标题】:ggplot geom_point Ignoring unknown aesthetics: text issue?ggplot geom_point 忽略未知的美学:文本问题?
【发布时间】:2023-04-02 03:35:02
【问题描述】:

我正在生成一个 SVG 分面图。我希望在将鼠标悬停在点上时出现工具提示。我在 ggplot/geom_point 中使用text 美学来制作工具提示文本。

产生警告...Warning: Ignoring unknown aesthetics: text。尽管有警告,它实际上会产生一个工具提示,正如我在下面的geom_pointsprintf 中定义的那样。但是,一旦图表中的分面数量超过 21 个,工具提示只会针对点的子集出现。只是看起来不可靠。但是,删除 text 美学总是会导致在 任何 个方面的 所有 点的默认工具提示。当包含text 美学时,生成的工具提示是默认文本和我定义的定制文本的组合,看起来像这样...screenshot of tooltip... 不理想,但至少它包含我想要显示的信息,特别是将 Rate/'000 作为实际值而不是日志值。

我应该避免这个功能还是有更好、更可靠的方法来实现这个效果?

    p <- ggplot(data=df.data_chart_category
               ,aes(x=TourDate, y=rate_per_thousand_lifts, group=key, colour=factor(key))
               ,environment = environment()
        ) +
        geom_point(aes(size = size, text = sprintf("Rate/'000: %s<br>Misses: %s<br>Hits: %s<br>Total Lifts: %s", rate_per_thousand_lifts, misses, hits, total_tour_count)), alpha=0.4) +
        scale_size(name = "Bin count", breaks = c(10, 50, 100, 500, 800, 1000), range = c(1,12)) +
        scale_color_manual("", values = c("Lifter1" = "red", "Lifter2" = "green", "Lifter3" = "lightblue", "Lifter4" = "purple", "NoLifter" = "cyan", "GPS" = "darkgrey")) +
        guides(colour = guide_legend(override.aes = list(size=10))) +
        facet_wrap(as.formula(paste("~", facet_wrap_column_name)), ncol=number_of_facet_columns) +
        labs(x = x_axis_label, y = snr_y_axis_label, title = snr_chart_title, subtitle = snr_chart_subtitle, caption = snr_chart_caption, color="Lifter") +
        theme_few() +
        theme(axis.text.x = element_text(angle=90, vjust=-0.01)) + 
        theme(axis.title = element_text(size = axis_font_size)) + 
        theme(plot.title = element_text(color = '#666666', 
                                  face = 'bold',
                                  size = title_font_size,
                                  hjust = 0)) + 
        scale_y_log10()

    pp <- ggplotly(p)
    htmlwidgets::saveWidget(widget=pp, file="index.html", selfcontained=FALSE)

【问题讨论】:

  • 我查看了绘图对象,很明显正确的文本被分配给绘图对象元素。迭代对象在这里并没有帮助,而且在任何情况下,考虑到方面的存在,这在我看来有点棘手。我已经在https://github.com/liamcaffrey/svg_tooltip.git 放置了一个完整的示例,其中包含 dput 数据。我已经包含了示例 png 和 html/svg 文件。工具提示似乎总是适用于零值,有时也适用于非零值

标签: r text ggplot2


【解决方案1】:

我的示例有点像我预期的那样工作。我并不真正了解如何设置定制工具提示。我发布了一个工作示例here。该示例的数据仍然可以在 TooltipNotWorkingData.txt

找到

与我的工具提示参数放置有关的主要问题。

    p <- ggplot(data=df.data_chart_category
               ,aes(x=calendar_day, y=rate_per_thousand, group=key, colour=factor(key), text = tooltip, onclick = clickjs)
               ,environment = environment()
        )

它应该是 ggplot/aes 而不是 geom_point/aes 的一部分。在 ggplotly 调用 pp &lt;- ggplotly(p, tooltip = "tooltip") 中引用工具提示是覆盖默认工具提示的必要条件。

我在某些尺寸图表上的工具提示显示仍然存在问题,我已经在 SO here 上提出了一个新问题。

【讨论】:

    【解决方案2】:

    我不认为这里的解决方案是正确的,因为这显然是一个错误,因为从 ggplotly 的角度来看,文本属性在 geom_pointgeom_vline(我正在使用)中完全有效,所以我的解决方案这将是:

    gg <- gg + suppressWarnings(geom_point(aes(size = size, text = sprintf("Rate/'000: %s<br>Misses: %s<br>Hits: %s<br>Total Lifts: %s", rate_per_thousand_lifts, misses, hits, total_tour_count)), alpha=0.4))
    

    【讨论】:

      【解决方案3】:

      plotly 工具提示的问题通常在构建绘图对象和在其中摆弄text 时得到修复:

      for (i in 1:nrow(df.data_chart_category)){
          pp$x$data[[i]]$text <- c(pp$x$data[[i]]$text, "") 
      }
      

      很难检查它在这种情况下是否有效,因为我们没有原始数据框或可重现的示例。

      【讨论】:

      • 好的。这看起来很整洁。谢谢你。我会试一试。我在手机上看这个,所以我现在也不能玩!看起来您正在访问每行的dataxtext。我看不到它,但也没有y 部分吗?工具提示适用于 xy 的组合。很抱歉没有代码,但感谢指向正确方向的指针。明天我会在pp 的内部戳一下。
      • for (i in 1:length(pp$x$data)){ pp$x$data[[i]]$text &lt;- c(_vector_of_length_count_of_x_) } 其中 vector_of_length_count_of_x 是根据 df.data_chart_category 的内容构建的。我在这里要做更多的调查,但我想我知道该怎么做。 Tnx
      • 我查看了绘图对象,很明显正确的文本被分配给绘图对象元素。迭代对象在这里并没有帮助,而且在任何情况下,考虑到方面的存在,这在我看来有点棘手。我已经在link 放置了一个完整的示例,其中包含 dput 数据。我已经包含了示例 png 和 html/svg 文件。工具提示似乎总是适用于零值,有时也适用于非零值。
      【解决方案4】:

      我意识到这是旧的,但我找到了一个适合我的解决方案。

      我在尝试更新 ggplotly() 中的 tooltips = "text" 参数时一直遇到这个问题,并且由于某种原因它无法使用来自 ggplot 的映射进行更新时感到沮丧。

      我发现一个奇怪的事情是,由于某种原因,当stat = "sum" 它不会更新工具提示中的文本并在生成绘图时返回错误Ignoring unknown aesthetics: text。但是,stat = "count"stat = "identity" 都可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多