繁体   English   中英

plotly R:带有两个轴的条形图

[英]plotly R: bar chart with two axes

是否可以使用 plotly for R 为条形图设置两个轴?

代码是从plotly 条形图示例修改而来的

library(plotly)

x <- c('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
y1 <- c(20, 14, 25, 16, 18, 22, 19, 15, 12, 16, 14, 17)/10
y2 <- c(19, 14, 22, 14, 16, 19, 15, 14, 10, 12, 12, 16)
data <- data.frame(x, y1, y2)

#The default order will be alphabetized unless specified as below:
data$x <- factor(data$x, levels = data[["x"]])

p <- plot_ly(data, x = ~x, y = ~y1, type = 'bar', name = 'Primary Product', marker = list(color = 'rgb(49,130,189)')) %>%
  add_trace(y = ~y2, name = 'Secondary Product', marker = list(color = 'rgb(204,204,204)')) %>%
  layout(xaxis = list(title = "", tickangle = -45),
         yaxis = list(title = ""),
         margin = list(b = 100),
         barmode = 'group')
p

这给出:

条形图 1

初级产品的值比次级产品小得多 - 我的目的是按月比较比例,同时仍然让 y 轴显示实际值而不是标准化值,所以它看起来像这样(模拟):

在此处输入图片说明

我曾尝试情节帮助添加另一个轴,这是代码。 但是,它似乎没有做任何事情,生成的图表与第一个相同。

library(plotly)

x <- c('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
y_1 <- c(20, 14, 25, 16, 18, 22, 19, 15, 12, 16, 14, 17)/10
y_2 <- c(19, 14, 22, 14, 16, 19, 15, 14, 10, 12, 12, 16)
data <- data.frame(x, y_1, y_2)

#The default order will be alphabetized unless specified as below:
data$x <- factor(data$x, levels = data[["x"]])

ay <- list(
  tickfont = list(color = "red"),
  overlaying = "y",
  side = "right",
  title = "second y axis"
)
p <- plot_ly(data, x = ~x, y = ~y_1, type = 'bar', name = 'Primary Product', marker = list(color = 'rgb(49,130,189)')) %>%
  add_trace(y = ~y_2, name = 'Secondary Product', marker = list(color = 'rgb(204,204,204)'), axis = "y2") %>%
  layout(yaxis2 = ay,
         xaxis = list(title = "", tickangle = -45),
         yaxis = list(title = ""),
         margin = list(b = 100),
         barmode = 'group')
p

2018 年 8 月 9 日更新

MLavoie 发布了此代码,与尝试类似,但是它提供了一个堆积条形图 - 这不是预期的结果。

data$x <- factor(data$x, levels = data[["x"]])

ay <- list(
  tickfont = list(color = "red"),
  overlaying = "y",
  side = "right",
  title = "second y axis"
)

p <- plot_ly() %>% 
add_bars(data, x = ~x, y = ~y1, name = 'Primary Product', marker = list(color = 'rgb(49,130,189)')) %>%
add_bars(data, x = ~x, y = ~y2, name = 'Secondary Product', marker = list(color = 'rgb(204,204,204)'), yaxis = "y2") %>%
layout(yaxis2 = ay,
       xaxis = list(title = "", tickangle = -45),
       yaxis = list(title = ""),
       margin = list(b = 100),
       barmode = 'group')
p  

在此处输入图片说明

我玩了这个答案,发现以下导数可以给出最好的结果。

这是结果图:

https://i.stack.imgur.com/CLRNe.png

library(plotly)
library(dplyr)

x <- c('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
y1 <- c(20, 14, 25, 16, 18, 22, 19, 15, 12, 16, 14, 17)/10
y2 <- c(19, 14, 22, 14, 16, 19, 15, 14, 10, 12, 12, 16)
data <- data.frame(x, y1, y2)

data$x <- factor(data$x, levels = data[["x"]])

ay <- list(
  overlaying = "y",
  side = "right",
  title = "Right Hand Axis"
)

p <- plot_ly() %>% 
  add_bars(data, x = ~x, y = ~y1, name = 'Primary Product (LHS)', 
           marker = list(color = 'rgb(49,130,189)'), offsetgroup = 1) %>%
  add_bars(data, x = ~x, y = ~y2, name = 'Secondary Product (RHS)', 
           marker = list(color = 'rgb(204,204,204)'), yaxis = "y2", offsetgroup = 2) %>%
  layout(yaxis2 = ay,
         xaxis = list(title = "Time Period", tickangle = -45),
         yaxis = list(title = "Left Hand Axis"),
         margin = list(b = 100),
         barmode = 'group',
         legend = list(x = 1.1, y = 1))

p  

我认为你有一些错别字,但这项工作。

data$x <- factor(data$x, levels = data[["x"]])

ay <- list(
  tickfont = list(color = "red"),
  overlaying = "y",
  side = "right",
  title = "second y axis"
)

p <- plot_ly() %>% 
add_bars(data, x = ~x, y = ~y1, name = 'Primary Product', marker = list(color = 'rgb(49,130,189)')) %>%
add_bars(data, x = ~x, y = ~y2, name = 'Secondary Product', marker = list(color = 'rgb(204,204,204)'), yaxis = "y2") %>%
layout(yaxis2 = ay,
       xaxis = list(title = "", tickangle = -45),
       yaxis = list(title = ""),
       margin = list(b = 100),
       barmode = 'group')
p

一个解决方案是创建两个额外的跟踪。 这是 Python 中的一个示例:

在此处输入图片说明

此代码基于以下单独问题的代码: Plotly Python: Align X-Axes in a grouped bar chart with multiple Y-axis

根据这里的讨论,这应该有效。

x <- c('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
y1 <- c(20, 14, 25, 16, 18, 22, 19, 15, 12, 16, 14, 17)/10
y2 <- c(19, 14, 22, 14, 16, 19, 15, 14, 10, 12, 12, 16)
data <- data.frame(x, y1, y2)

data$x <- factor(data$x, levels = data[["x"]])

ay <- list(
  tickfont = list(color = "red"),
  overlaying = "y",
  side = "right",
  title = "second y axis"
)

p <- plot_ly() %>% 
  add_bars(data, x = ~x, y = ~y1, name = 'Primary Product', 
           marker = list(color = 'rgb(49,130,189)'), offsetgroup = 1) %>%
  add_bars(data, x = ~x, y = ~y2, name = 'Secondary Product', 
           marker = list(color = 'rgb(204,204,204)'), yaxis = "y2", offsetgroup = 2) %>%
  layout(yaxis2 = ay,
         xaxis = list(title = "", tickangle = -45),
         yaxis = list(title = ""),
         margin = list(b = 100),
         barmode = 'group')
p  

属性offsetgroup允许您更好地控制交叉跟踪偏移和宽度值的计算方式。

结果图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM