条形图仅显示一个 x 值的条形图

Posted

技术标签:

【中文标题】条形图仅显示一个 x 值的条形图【英文标题】:Bar-plot does not show bar for only one x value 【发布时间】:2020-01-02 17:31:00 【问题描述】:

我在定义 x 轴的日期范围时遇到了 plotly 条形图的问题。

当有一个或多个数据点具有相同的 x 值时,条形图不会显示在图中。如果至少有两个不同的 x 值,或者如果我不使用 x 轴范围,则条形将按应有的方式显示。

下面是一个例子(我目前使用lubridate来处理日期)。

library(lubridate)
library(plotly)

# Same x-value: bar does not show
plot_ly(x = c(ymd("2019-08-25"), ymd("2019-08-25")), y = c(1, 2), type = "bar") %>%
    layout(xaxis = list(range = ymd(c("2019-08-20", "2019-08-30"))))

# Different x-values: bars are shown
plot_ly(x = c(ymd("2019-08-25"), ymd("2019-08-26")), y = c(1, 2), type = "bar") %>%
    layout(xaxis = list(range = ymd(c("2019-08-20", "2019-08-30"))))

# No x-axis range defined, same x-values: the bar is shown
plot_ly(x = c(ymd("2019-08-25"), ymd("2019-08-25")), y = c(1, 2), type = "bar")

有什么办法吗?

编辑:为了比较,ggplot2 没有同样的问题:

# ggplot works like expected
library(lubridate)
library(ggplot2)

ggplot(NULL, aes(x = ymd(c("2019-08-25", "2019-08-25")), y = c(1, 2))) +
    geom_col() +
    xlim(ymd(c("2019-08-20", "2019-08-30")))

【问题讨论】:

你想在这里实现什么?当同一条有 2 个值时,它们必须加起来为一个条吗?还是您希望 2 个条相互堆叠? @Arcoutte 它们将作为默认值相加(如示例 3 中所示)。如果数据点具有与color 参数绑定的第三个特征,它们将堆叠,在这种情况下,我使用layout(barmode = "stack", ...)。但我选择为这个问题使用一个最小的工作示例。 【参考方案1】:

您的代码实际上已在您的第一个版本中被理解,但您需要设置条的宽度,以便它们最终显示。

我不确定单位是什么(可能是毫秒???),因此您可能需要尝试使用它或进行研究以获得适合您实际场景的宽度。

plot_ly() %>%
  add_bars(x = c(ymd("2019-08-25"), ymd("2019-08-25")), y = c(1, 2), type = "bar",width=100000000)%>%
  layout(xaxis = list(range = ymd(c("2019-08-20", "2019-08-30"))))

【讨论】:

谢谢,它工作得很好!因此,似乎最好使用plotly::add_* 函数,因为plot_ly(..., width) 会更改绘图的宽度,而不是条形的宽度。我正在使用日间单位。由于 1 天 = 8.64e+7 毫秒,width = 6.5e+7 足以在条形之间留出一些间距。

以上是关于条形图仅显示一个 x 值的条形图的主要内容,如果未能解决你的问题,请参考以下文章

如何制作每个 X 轴项目有两个值的垂直条形图

仅具有突出显示值的 matplotlib 条形图

ZingChart:具有一系列空值的堆积条形图

Matplotlib 条形图不接受数组作为高度参数

使用百度 ECharts 在堆积条形图顶部显示数据值的总和

“更改开”中有两个值的条形图,跳过值为 0 的条形图