使用Plotly创建带有彩带的图表

3

我需要在散点图上画出两条加速度与油耗之间的斜率线,一条针对轻型车,另一条针对重型车。我创建了以下内容:

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")

这给我带来了以下结果:

enter image description here

现在,我想为重型车辆创建一个斜坡,为轻型车辆创建另一个斜坡,我知道我需要使用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 吗? - Andrew Gustar
还没有,我正在尝试仅使用plotly解决它。 - Aida Haliti
1
请在您的帖子中包含一个最小的样本数据集,以便更容易地重现您所拥有的内容。您可以使用 dput(例如 dput(mtcars)),这将使人们更容易地剪切/粘贴您的数据。 - steveb
1个回答

6
您可以使用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')

Which gives the following plot: enter image description here


大家好,我使用了这里的提示,在我的Shiny页面底部放置了一些图表的缎带(http://michaelvonplato.shinyapps.io/covidDeaths)- 有什么办法可以去掉缎带外边缘的点吗?我尝试了很多变量的排列组合,但都没有成功。谢谢。 - Michael
你好Michael,你可以筛选只在带内的点,并绘制这些点。当然,你应该保留原始(未经过滤的)数据以进行带计算。我希望这可以帮到你。否则,我的建议是发布一个新问题。在评论中,你的问题不会被所有人看到 :) - byouness
顺便提一下,如果答案解决了你的问题,你应该接受它,这样其他遇到同样问题的人就能看到它了。谢谢! - byouness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接