闪亮上下文中 ggplotly 的问题

Issues with ggplotly within Shiny context

使用下面的代码,我可以创建图中所示的绘图。我正在尝试解决以下问题:

1- 如何在标题和情节之间放置图例。我想要水平格式的图例,而不是当前的垂直格式。

2- 我怎样才能将情节标题加粗并居中?

3- 如何根据“残疾”变量在 geom_point 函数中使用不同的形状?

4- 如何重命名标签,使其显示为“Age at Death”而不是当前名称:“AgeatDeath”?

谢谢,

纳德

 IDD_line <-
  ggplot(IDD_plot) +
  geom_line(aes(x = Year, y = AgeatDeath, color = Disability), size = 1) +
  geom_point(aes(x = Year,
                 y = AgeatDeath,
                 color = Disability),
             size = 1.5,
             shape = 21) +
  scale_x_continuous(breaks = seq(2008, 2017, 1)) +
  labs(
    x = "Year",
    y = "Age at Death",
    caption = (""),
    face = "bold"
  ) +
  theme_bw() +
  scale_y_continuous(breaks = seq(35, 80, 5)) +
  ggtitle(paste("Age of Death by Year (2008 to 2017)")) +
  theme(
    legend.title = element_blank(),
    axis.text = (blue.bold.10.text),
    legend.position = "top"
  )
output$IDD_plot <- renderPlotly(ggplotly(IDD_line) %>%
                                  config(displayModeBar = F))

这比我最初预期的要难一些。也许其他人会想出一些更好的解决方案,但这就是我所拥有的。

  1. 如何在标题和情节之间放置图例。我想要水平格式的图例,而不是当前的垂直格式。

您可以在调用 ggplotly 后在 layout 中执行此操作。要放入水平形式,请使用 orientation = "h"。如果你指定 y = 1.2 这将在图上方(如果你只是将 yanchor 设置在“顶部”这将在靠近顶部的图本身上)。

此外,您需要添加额外的边距,这样图例就不会与标题重叠。使用 margin 设置左、右、下和上边距(lrbt)。

layout(legend = list(x = 0, y = 1.2, orientation = "h"),
       margin = list(l = 50, r = 50, b = 100, t = 100)...
  1. 如何加粗并居中标题?

要加粗标题,可以添加HTML标签,比如ggtitle中的<b>title</b>。要使标题居中,请将其添加到 layout 中,如 #1 中那样,使用 xanchor:

layout(legend = list(x = 0, y = 1.2, orientation = "h"),
       margin = list(l = 50, r = 50, b = 100, t = 100),
       title = list(xanchor = "center", x = .5))
  1. 如何根据“残疾”变量在geom_point函数中使用不同的形状?

要使形状取决于“残疾”,您的审美需要 shape = Disability。棘手的部分是,如果您在 geom_point 内的 aes 内执行此操作,您将在转换为 ggplotly 后得到重复的图例。您可以在 geom_point.

之外使用单独的 aes 来解决这个问题

有关详细信息,请参阅 this github issue comment

  1. 如何重命名标签,使其显示为“死亡年龄”而不是当前名称:“AgeatDeath”?

一种方法是在您的 aes 中使用 text 并以这种方式阐明您的标签。这将包括带有 <br> 的换行符,用于整数值的 %d 和用于字符串(对于 Disability)的 %s

text = sprintf("Year: %d<br>Age at Death: %d<br>Disability: %s", 
               Year, AgeatDeath, Disability)

然后,在您的 ggplotly 调用中,包括 tooltip = "text"

所以把这些放在一起,你有:

IDD_line <- ggplot(IDD_plot) +
  aes(color = Disability, 
      shape = Disability, 
      group = Disability, 
      text = sprintf("Year: %d<br>Age at Death: %d<br>Disability: %s", 
                     Year, AgeatDeath, Disability)) +
  geom_line(aes(x = Year, y = AgeatDeath), size = 1) +
  geom_point(aes(x = Year,
                 y = AgeatDeath),
             size = 1.5) +
  scale_x_continuous(breaks = seq(2008, 2017, 1)) +
  labs(
    x = "Year",
    y = "Age at Death",
    caption = (""),
    face = "bold"
  ) +
  theme_bw() +
  scale_y_continuous(breaks = seq(35, 80, 5)) +
  ggtitle(paste("<b>Age of Death by Year (2008 to 2017)</b>")) +
  theme(
    legend.title = element_blank(),
    axis.text = (blue.bold.10.text) #,
    #legend.position = "top"
  )

而且,

output$IDD_plot <- renderPlotly(
    ggplotly(IDD_line, tooltip = "text") %>%
      config(displayModeBar = F) %>%
      layout(legend = list(x = 0, y = 1.2, orientation = "h"),
             margin = list(l = 50, r = 50, b = 100, t = 100),
             title = list(xanchor = "center", x = .5))
    )