【问题标题】:Creating ribbons with plotly用 plotly 创建丝带
【发布时间】:2018-10-22 19:02:23
【问题描述】:

我需要在散点图上绘制两个加速度与 mpg 的斜率, 轻型车一坡,重型车一坡。我创建了这个:

cars_light <- cars_log[cars_log$log.weight. <= log(mean(cars$weight)), ]
cars_heavy <- cars_log[cars_log$log.weight. > log(mean(cars$weight)),]
cars_log$wt_cat <- ifelse(cars_log$log.weight. > log(mean(cars$weight)), 'heavy', 'light')

到目前为止,我已经通过这样做创建了散点图:

    plot_ly(
  data = cars_log,
  type = "scatter",
  x = ~log.acceleration.,
  y = ~ log.mpg.,
  color = ~ factor(wt_cat),
  colors = c("#8bc34a", "#ff5722"),
  marker = list(size = 10, opacity = 0.6)
) %>%
  layout(title = "Heavy cars VS light cars")

这给了我这个结果:

现在,我想为重型汽车创建一个斜坡,为轻型汽车创建另一个斜坡,我知道我需要使用 plotly 的 add_ribbons 跟踪,但我不知道如何生成它。我在用 plotly 计算 lm 时遇到问题。 我可以用 ggplot 做同样的事情,但我不知道如何用 plotly 做到这一点..

    ggplot(cars_log, aes_string('log.acceleration.', 'log.mpg.')) +
  geom_point(aes(color = factor(wt_cat))) +
  geom_smooth(method = 'lm', aes(color = factor(wt_cat)))

这是我的数据样本:

    > cars_log[1:5,]
  log.mpg. log.cylinders. log.displacement. log.horsepower. log.weight. log.acceleration. model_year origin
1 2.890372       2.079442          5.726848        4.867534    8.161660          2.484907         70      1
2 2.708050       2.079442          5.857933        5.105945    8.214194          2.442347         70      1
3 2.890372       2.079442          5.762051        5.010635    8.142063          2.397895         70      1
4 2.772589       2.079442          5.717028        5.010635    8.141190          2.484907         70      1
5 2.833213       2.079442          5.710427        4.941642    8.145840          2.351375         70      1

【问题讨论】:

  • 你试过ggplotly吗?
  • 还没有,我只是想用 plotly 来解决它..
  • 请在您的帖子中包含一组最少的示例数据,以便更容易复制您拥有的内容。您可以使用dput(如dput(mtcars)),这将使人们更容易剪切/粘贴您的数据。

标签: r ggplot2 plotly scatter-plot r-plotly


【解决方案1】:

您可以使用add_ribbons() 函数。它的主要三个论点是:

  • data数据
  • x x 值
  • ymin功能区下界
  • ymax功能区的上限

由于缺乏最小的数据集,我采用了这个:plotly regression line R,它用于一个密切的问题(即在 R Plotly 中绘制回归线)。使用这个数据集,这是一个在 Plotly 外部完成回归的示例,其输出使用broom::augment() 格式化,然后用于创建功能区:

library(plotly)
library(broom)
data(airquality)
airq <- airquality %>% 
      filter(!is.na(Ozone))
fit <- lm(Ozone ~ Wind, data = airq)
airq %>% 
  plot_ly(x = ~Wind, name = 'Scatter') %>% 
  add_markers(y = ~Ozone) %>% 
  add_ribbons(data = augment(fit,se_fit = TRUE),
              ymin = ~.fitted - 1.96 * .se.fit,
              ymax = ~.fitted + 1.96 * .se.fit,
              line = list(color = 'rgba(7, 164, 181, 0.05)'),
              fillcolor = 'rgba(7, 164, 181, 0.2)',
              name = '95% ribbon')

这给出了以下情节:

【讨论】:

  • 大家好,我用这里的提示在我闪亮页面底部的一些图表上放了一条丝带 (michaelvonplato.shinyapps.io/covidDeaths) - 知道如何去除丝带外边缘上的点?我尝试了很多变量的排列,但没有运气。谢谢。
  • 您好 Michael,您可以仅过滤功能区内的点并绘制这些点。当然,您应该保留原始(未过滤的)数据以进行功能区计算。我希望这有帮助。否则,我的建议是发布一个新问题。在评论中,您的问题并非对所有人可见:)
  • 顺便说一句,如果它解决了您的问题,您应该接受答案,以便其他面临与您相同问题的人可以看到它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-05-23
  • 2018-05-16
  • 2011-11-25
  • 2022-01-16
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多