如何使用Plotly在R中正确分组

时间:2019-01-08 09:26:36

标签: r r-plotly roracle

我在将数据归类到R下的Plotly时遇到了一些问题。首先,我使用的是csv文件中的本地数据,并使用以下命令进行读取:

geogrid_data <- read.delim('geogrid.csv', row.names = NULL, stringsAsFactors = TRUE)

使用以下命令,绘图进展顺利:

library(plotly)
library(RColorBrewer)

x <- list(
  title = 'Date'
)
p <- plotly::plot_ly(geogrid_data,
type = 'scatter',
x = ~ts_now,
y = ~absolute_v_sum,
text = paste('Table: ', geogrid_data$table_name,
             '<br>Absolute_v_Sum: ', geogrid_data$absolute_v_sum),
hoverinfo = 'text',
mode = 'lines',
color = list(
  color = colorRampPalette(RColorBrewer::brewer.pal(11,'Spectral'))(
    length(unique(geogrid_data$table_name))
  )
),

transforms = list(
  list(
    type = 'groupby',
    groups = ~table_name
  )
)
) %>% layout(showlegend = TRUE, xaxis = x)

在这里输出:

Output on grouping of csv data

然后,我将使用ROracle软件包将数据源更改为Oracle数据库表,按如下方式读取数据:

# retrieve data into resultSet object
rs <- dbSendQuery(con, "SELECT * FROM GEOGRID_STATS")
# fetch records from the resultSet into a data.frame
geogrid_data <- fetch(rs)
# free resources occupied by resultSet
dbClearResult(rs)
dbUnloadDriver(drv)
# remove duplicates from dataframe (based on TABLE_NAME, TS_BEFORE, TS_NOW, NOW_SUM)
geogrid_data <-  geogrid_data %>% distinct(TABLE_NAME, TS_BEFORE, TS_NOW, NOW_SUM, .keep_all = TRUE)
# alter date columns in place
geogrid_data$TS_BEFORE <- as.Date(geogrid_data$TS_BEFORE, format='%d-%m-%Y')
geogrid_data$TS_NOW <- as.Date(geogrid_data$TS_NOW, format='%d-%m-%Y')

并将绘图调整为:

p <- plotly::plot_ly(
type = 'scatter',
x = geogrid_data$TS_NOW,
y = geogrid_data$ABSOLUTE_V_SUM,
text = paste('Table: ', geogrid_data$TABLE_NAME,
             '<br>Absolute_v_Sum: ', geogrid_data$ABSOLUTE_V_SUM,
             '<br>Date: ', geogrid_data$TS_NOW),
hoverinfo = 'text',
mode = 'lines',
color = list(
  color = colorRampPalette(RColorBrewer::brewer.pal(11,'Spectral'))(
    length(unique(geogrid_data$TABLE_NAME))
  )
),

transforms = list(
  list(
    type = 'groupby',
    groups = geogrid_data$TABLE_NAME
  )
)
) %>% layout(showlegend = TRUE, xaxis = x)

不幸的是,这似乎导致了分组方面的一些问题。

Output on grouping of data from database table

当您将鼠标悬停在数据点上时,从标签文本中可以看到,该点表示 NY_SKOV_PLANTEB_MW_POLY 的数据,而图例设置为显示 NY_BYGN_MW_POLY 的数据。查看该图中的其他数据点,我发现该图中各种各样的点混合在一起,其中一些代表 NY_BYGN_MW_POLY 的数据,其中大多数不是。

关于时间线的绘图也不再起作用,例如数据从12月11日-12月10日-12月10日-12月12日-12月20日-12月17日-12月16日-12月15日开始绘制。

在处理数据时哪里出错了,我该怎么做才能正确处理数据?

1 个答案:

答案 0 :(得分:0)

当然,应该看一下数据……谢谢Marco,在您提出问题后,我确实看了我的数据。

在某些情况下,我只是假设事情。 使用CSV文件中的数据绘制所有数据的原因很简单。 CSV文件中手动编译的所有信息均来自按日期排序的电子邮件中的信息。因此,我将数据按日期排序在csv文件中进行编译,而Plotly在按table_name分组数据方面没有任何问题。

在查看了我的数据后,我整理了一下,只保留了需要显示在图中的数据,并使用dplyr对数据进行了时间排序。

geogrid_data <- dplyr::arrange(geogrid_data, TS_NOW)

仅按 time 而不是 time 表名,因为按表名进行的排序是无论如何由Plotly和 groupby 语句

完成