【问题标题】:R Plotly: Sort x-axis by categorical variable for scatter plotR Plotly:按散点图的分类变量对 x 轴进行排序
【发布时间】:2019-09-17 14:46:47
【问题描述】:

我想手动对 R 散点图的 x 轴进行排序,使用串扰按代号(代码)过滤,但我的 x 轴是时间序列分类变量(时间;即 2019 年 1 月至 2 月,3 月-2019 年 4 月)。默认情况下,R 按字母顺序对 x 轴进行排序,这使我的 x 轴无序并且点混乱(即第一个点连接到最后一个点,然后连接到第四个点......)

我尝试将时间转换为因子并手动设置顺序,但图表上的点仍然混乱

非常感谢任何帮助!

#Create dataset
df <- data.frame(
  "Code" = c("A","A","A","A","A","B","B","B","B","B"),
  "Time" = c("2016-2018","Jan-Feb 2019","Mar-Apr 2019","May-Jun 2019","Jul-Aug 2019", "2016-2018","Jan-Feb 2019","Mar-Apr 2019","May-Jun 2019","Jul-Aug 2019"),
  "Rate" = c(40.8, 50.8, 15.3, 39, 40.1, 70.2, 38.3, 25.2, 46.7, 41.9)
)

#Create filter
filter <- SharedData$new(df)
filter_select("Code", "Select Provider", filter, ~Code, multiple = FALSE)

#Graph
filter %>%
  plot_ly(
    x = ~`Time`,
    y = ~`Rate`,
    type = "scatter", 
    mode="lines+markers"
  )

#ATTEMPT 1: Convert Time to factor, rerun filter, then graph
df$Time <- factor(df$Time, levels = c("2016-2018", "Jan-Feb 2019", "Mar-Apr 2019", "May-Jun 2019", "Jul-Aug 2019"))

filter <- SharedData$new(df)
filter_select("Code", "Select Provider", filter, ~Code, multiple = FALSE)

plot_ly(df,
  x = ~`Time`,
  y = ~`Rate`,
  type = "scatter", 
  mode="lines+markers"
)

【问题讨论】:

    标签: r plotly


    【解决方案1】:

    如果您在 SharedData 对象而不是原始数据帧上调用 plot_ly,则可以使用 filter_select 选项以正确的顺序显示代码 A 和 B:

    bscols(filter_select("Code", "Select Provider", filter, ~Code, multiple = FALSE), 
            plot_ly(filter,
                             x = ~`Time`,
                            y = ~`Rate`,
                          type = "scatter", 
                          mode="lines+markers"
                  ))
    

    【讨论】:

      【解决方案2】:

      您的问题是您的Time 列已经是factor。如果您在设置数据框时设置stringsAsFactors = FALSE,您的代码将起作用。 我还会在plotly 中添加color 选项。

      df <- data.frame(
        "Code" = c("A","A","A","A","A","B","B","B","B","B"),
        "Time" = c("2016-2018","Jan-Feb 2019","Mar-Apr 2019","May-Jun 2019","Jul-Aug 2019", "2016-2018","Jan-Feb 2019","Mar-Apr 2019","May-Jun 2019","Jul-Aug 2019"),
        "Rate" = c(40.8, 50.8, 15.3, 39, 40.1, 70.2, 38.3, 25.2, 46.7, 41.9),
        stringsAsFactors = FALSE
      )
      df$Time <- factor(df$Time, levels = c("2016-2018", "Jan-Feb 2019", "Mar-Apr 2019",
                                            "May-Jun 2019", "Jul-Aug 2019"))
      #Create filter
      filter <- SharedData$new(df)
      filter_select("Code", "Select Provider", filter, ~Code, multiple = FALSE)
      
      #Graph
      filter %>%
        plot_ly(
          x = ~`Time`,
          y = ~`Rate`,
          color = ~`Code`,
          type = "scatter", 
          mode="lines+markers"
        )
      

      【讨论】:

        猜你喜欢
        • 2021-02-22
        • 2021-03-05
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 2020-10-19
        相关资源
        最近更新 更多