【问题标题】:Multiple y-axes in shiny app w/ highcharter带有 highcharter 的闪亮应用程序中的多个 y 轴
【发布时间】:2018-02-14 08:31:51
【问题描述】:

我正在尝试使用共享 x 轴(天)但具有多个 y 轴(百分比和计数)的 highcharter 在闪亮的应用程序中呈现图表。经过一些研究,我似乎应该使用 'hc_yAxis_multiples' 方法。在左侧 y 轴上,我显示了 %。在右侧 y 轴上,我希望显示计数。有一个基于左侧 y 轴 (%) 的折线图和一个基于右侧 y 轴显示的堆叠条形图。

我已经能够叠加这两个图表,但是基于右侧 y 轴的条形图部分未格式化为相应的 y 轴。根据我一直在看的内容,似乎这样的事情会产生我想要的结果:

##This first block is to show what the data types of the variables I'm using are and what the structure of my df looks like
df$inbox_rate <- df$total_inbox / df$total_volume
df$inbox_rate <- round((df$inbox_rate*100),0)
df$received_dt <- as.character(df$received_dt)
df$received_dt <- as.Date(df$received_dt, "%Y%m%d")
df <- df[order(df$received_dt),]

## This second block here is where I'm trying to build the chart with two Y-axes
hc <- highchart()%>%
hc_title(text = paste(domain_name,sep=""),align = "center") %>%
hc_legend(align = "center") %>%
hc_xAxis(type = "datetime", labels = list(format = '{value:%m/%d}')) %>%
hc_yAxis_multiples(list(title = list(text = "IPR"),labels=list(format = '{value}%'),min=0,
    max=100,showFirstLabel = TRUE,showLastLabel=TRUE,opposite = FALSE),
    list(title = list(text = "Total Subscribers"),min=0,max = max(df$total_users),
    labels = list(format = "{value}"),showLastLabel = FALSE, opposite = TRUE)) %>%
hc_plotOptions(column = list(stacking = "normal")) %>%
hc_add_series(df,"column",hcaes(
  x=received_dt,y=total_users,group=isp,yAxis=total_users)) %>%
hc_add_series(df,type="line",hcaes(
  x=received_dt,y=inbox_rate,group=isp,yAxis=inbox_rate)) %>%   
hc_exporting(enabled = TRUE) %>%
hc_add_theme(thm)
hc

但是这会产生something that looks like this

为了更深入地了解我正在使用的数据,domain_name 是一个字符串变量,如下所示:example.comtotal_users 变量是一个从 0 到大约 50000 变化的数字。received_dt 变量是一个日期,使用 as.Date(df$received_dt, "%Y%m%d") 格式化。 inbox_rate 变量是百分比,从 0 到 100。

即使条形的值变化很大,条形计数也会显示到图表的整个高度。重申一下,我希望条形图高度所基于的右 y 轴是 df$total_users 的计数。在 hc_yAxis_multiples 函数中,给出了两个列表。我认为第一个列表给出了左边的 y 轴,第二个给出了右边。我能找到的最接近我的问题的答案是this stackoverflow response

如果有人有任何见解,将不胜感激!

【问题讨论】:

  • 请添加一些数据来填写您的变量,这样人们就不必猜测您的dfdomain_namethmreceived_dt 是什么样的。任何有代表性的模拟数据就足够了。
  • 我添加了一些关于我正在使用的数据的见解。我希望这能消除任何困惑。
  • 没有。那是因为混乱不是主要问题。它与您需要帮助有关,因此您还提供了可以由查看此线程的任何人运行的代码 sn-ps。如果我必须花 15 分钟来找出“已经按照我想要的方式格式化”是什么意思,并用我自己的样本数据制作我自己的数据集,那么我只会生气并留下这个问题。如果你问自己为什么还没有人提供答案。
  • 对此我深表歉意。我在发布的代码块中添加了更多信息,显示了我如何计算变量以及如何格式化received_dt。希望这更符合对寻求帮助的人有用的内容。

标签: r highcharts shiny


【解决方案1】:

您在hc_add_series 中对yAxis 语句的使用似乎已关闭。首先,它不应该在hcaes 内部,其次,它是一个数字,指定系列属于哪个轴(按hy_yAxis_multiple 调用中的出现顺序)。所以应该使用hc_add_series(..., yAxis = 1) 将系列分配给第二个(右)轴。

下面是一个(完全不言自明的、独立的、最小的)示例,展示了它应该如何工作。

library(highcharter)

df <- data.frame(
  total_inbox = c(2, 3, 4, 5, 6),
  total_volume = c(30, 30, 30, 30, 30),
  total_users = c(300, 400, 20, 340, 330),
  received_dt = c("20180202", "20180204", "20180206", "20180210", "20180212"),
  isp = "ProviderXY"
)

df$inbox_rate <- df$total_inbox / df$total_volume
df$inbox_rate <- round((df$inbox_rate*100),0)
df$received_dt <- as.character(df$received_dt)
df$received_dt <- as.Date(df$received_dt, "%Y%m%d")
df <- df[order(df$received_dt),]

hc <- highchart()%>%
  hc_xAxis(type = "datetime", labels = list(format = '{value:%m/%d}')) %>%
  hc_yAxis_multiples(list(title = list(text = "IPR"),labels=list(format = '{value}%'),min=0,
                          max=100,showFirstLabel = TRUE,showLastLabel=TRUE,opposite = FALSE),
                     list(title = list(text = "Total Subscribers"),min=0,max = max(df$total_users),
                          labels = list(format = "{value}"),showLastLabel = FALSE, opposite = TRUE)) %>%
  hc_plotOptions(column = list(stacking = "normal")) %>%
  hc_add_series(df,type="column",hcaes(x=received_dt,y=total_users,group=isp),yAxis=1) %>%
  hc_add_series(df,type="line",hcaes(x=received_dt,y=inbox_rate,group=isp))

hc

也许以此为例,问题中的代码应该是什么样的。 Copy-Paste-Runnable,没有外部变量,并减去所有无关紧要的东西(例如主题和图例)。

【讨论】:

  • 非常感谢!是的,这是一个很大的帮助。也感谢你对我的包容,我会尽力效仿你的榜样,以确保我将来遵守标准的期望(这是我第一次询问堆栈溢出问题)。
  • 图表看起来好多了。我现在在我的代码中遇到的一个挥之不去的问题是左 y 轴现在上升到 120%,即使我将最大值设置为 100。在您提供的示例中,即使 highcharter 也不会发生这种情况代码基本相同。我不知道是什么改变导致了这种情况。如果我弄明白了,我会用调查结果更新这篇文章。
  • @P.Lawlor Ticks 是基于两个轴的数据一起计算的。因此,百分比轴上的刻度长度可能不是 100 的除数,因此加起来不会使 100% 成为刻度。 (例如,如果每个刻度的高度为 15%,则 105% 是刻度。)您可以通过添加固定的 tickAmount 来避免或重塑轴。我会选择tickAmount=11 在两个 y 轴上。 (从而覆盖内部计算过程。)
  • 再次感谢您!我将其更改为 5,并根据我正在使用的示例对其进行了修复,但我会将其更改为 11,以防其他示例计算不同。
猜你喜欢
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2018-01-29
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多