创建可视化

    通常,在R中生成图形的函数执行数据处理和图形渲染。例如,geom_histogram ()计算容器的大小和每个容器的计数,然后呈现图形。绘图函数通常需要将100%的数据传递给它们。在使用数据库时,这是一个问题。最好的方法是将数据转换转移到数据库,然后使用绘图函数呈现结果。

    本文有两个目标:

    • 的一个实际实现"在数据库中变换,在R中绘图"通过展示如何使用条形图可视化一个类别变量,使用直方图可视化单个连续变量,使用栅格图可视化两个连续变量,所有这些都使用数据库中的数据

    • 介绍一种技术,该技术简化了将绘图计算移动到数据库所需的复杂公式的使用

    另一种方法是使用已经实现了本文中共享的原则的助手R包,请参阅dbplot页面更多信息。

    酒吧的阴谋

    条形图用于测量和比较分类数据。将类别传递给geom_bar ()作为x将根据每个类别的行数自动计算条的高度。下面是一个典型的条形图使用的代码ggplot2

    Ggplot (data = flights) + geom_bar(aes(x = origin), stat = "count")

    数据转换

    因为dplyr是否用于计算数据库中每个类别的计数,离散值是否使用group_by (),紧随其后的是统计()来获取每个类别的行数。最后,收集()将结果下载到R:

    df < -台(案子,“航班”)% > % group_by(起源)()% > % % > %记录收集(df)
    ## # A tibble: 3 x 2 ## origin n ##   ## 1 LGA 104662 ## 2 EWR 120835 ## 3 JFK 111279

    在R中绘制结果

    数据转换步骤的结果现在可以用于ggplot2渲染情节。这一次,geom_col ()用来代替geom_bar ()因为栅栏的高度是预先计算好的dplyr

    Ggplot (data = df) + geom_col(aes(x = origin, y = n))

    变换和情节

    可以使用单一的管道代码行创建绘图。这在执行探索性数据分析时特别有用,因为很容易添加或删除过滤器,或更改正在分析的变量。

    台(反对,“航班”)% > % group_by(起源)% > %统计收集()()% > % % > % ggplot () + geom_col (aes (x =起源,y = n))

    柱状图

    直方图的目的是可视化一个连续变量的值的分布。它通过将值分组到具有相同值范围的容器中来实现这一点。本质上,直方图通过将变量的值拆分并放入多个箱中,将连续变量转换为离散变量。

    计算

    下面对创建直方图所需的计算进行细分,目的是强调将其处理转移到数据库的复杂性。

    例如,如果需要一个包含20个容器的直方图,并且变量的最小值为1,最大值为101,那么每个容器都需要为5。

    • 101(最大值)- 1(最小值)= 100
    • 100 / 20(箱数)= 5

    第一个容器的范围是1到6,第二个容器的范围是7到12,等等。

    之后,需要确定每个范围内的值的计数。在本例中,可能有两行值在1到6之间,有五行值在7到12之间。

    任何用于创建直方图的公式都需要计算容器,将值放在容器中,并且只调用所使用的数据库支持的数学函数。卡塔尔世界杯欧洲预选赛赛程表

    使用助手函数

    使用的优点dplyr将连续变量转换为离散变量意味着可以将一个解决方案应用于多种数据库类型。如果得到的公式是由大多数SQL数据库支持的基本函数组成的,并且用R表示,那么这是可能的卡塔尔世界杯欧洲预选赛赛程表dplyr可以将其转换成正确的SQL语法。

    不幸的是,公式相当长,如果在多个位置使用,可能会出错,因为对公式的任何更正可能不会传播到所有实例。要解决这个问题,可以使用助手函数。

    在下面的助手函数中var输入用于在未鉴定的R代码格式。在使用时dplyr,它将返回组装后的公式评估如在动词命令中。请随意将此函数复制到您的脚本或R Notebook中。

    该函数还有两个参数:

    • 垃圾箱-这允许自定义箱子的数量。默认为30
    • binwidth-用于指定箱子的大小。对象传递的任何值都会被覆盖垃圾箱论点。
    library(rlang) db_bin <- function(var, bins = 30, binwidth = NULL) {var <- enexpr(var) range <- expr((max(!!)var, na。rm = TRUE) - min(!!var, na。rm = TRUE))) if (is.null(binwidth)) {binwidth <- expr((!!范围/ ! !} else {Bins <- expr(as.integer(!!范围/ ! !} #使用floor()来确定bin值比#使用bin号或最大值或平均值更有意义,请自定义bin_number <- expr(as.integer(floor((!! !)var - min (! ! var, na.rm = TRUE)) / !! binwidth))) # Value(s) that match max(x) will be rebased to bin -1, giving us the exact number of bins requested expr(((!! binwidth) * ifelse(!! bin_number == !! bins, !! bin_number - 1, !! bin_number)) + min(!! var, na.rm = TRUE)) }

    注意,函数返回aquosure包含未鉴定的R代码,用来计算箱子。要了解更多关于这种方法是如何工作的,请参考这篇文章:编程与dplyr

    需要注意的是,所使用的数据库需要支持公式中调用的函数,例如卡塔尔世界杯欧洲预选赛赛程表min ()而且max ()

    下面是该函数的输出示例。注意,一个虚构的字段称为any_field则不会生成“缺少字段”错误。这是因为该公式尚未得到评估。

    db_bin (any_field)
    # # (((max (any_field na。rm = TRUE)- min(any_field, na.rm = TRUE))/30) * ## ifelse(as.integer(floor((any_field - min(any_field, na.rm = TRUE))/((max(any_field, ## na.rm = TRUE) - min(any_field, na.rm = TRUE))/30))) == ## 30, as.integer(floor((any_field - min(any_field, na.rm = TRUE))/((max(any_field, ## na.rm = TRUE) - min(any_field, na.rm = TRUE))/30))) - ## 1, as.integer(floor((any_field - min(any_field, na.rm = TRUE))/((max(any_field, ## na.rm = TRUE) - min(any_field, na.rm = TRUE))/30))))) + ## min(any_field, na.rm = TRUE)

    这是一个函数使用的例子binwidth.得到的公式有点不同。

    Db_bin (any_field, binwidth = 300)
    ## (300 * ifelse(as.integer(floor((any_field - min(any_field, na. integer))rm = TRUE)) / 300)) = = # # as.integer (max (any_field, na。rm = TRUE) - min(any_field, ## na.)rm = TRUE))/300), as.integer(floor((any_field - min(any_field, ## na.rm = TRUE))/300)) - 1, as.integer(floor((any_field - min(any_field, ## na.rm = TRUE))/300)))) + min(any_field, na.rm = TRUE)

    数据转换

    使用helper函数时,数据处理非常简单。的db_bin函数在内部使用group_by ().有几个必做的记住:

    • 方法使用的字段的名称db_bin ()函数—如果未指定名称,dplyr将使用较长的公式文本作为字段的默认名称,这在大多数情况下违反了数据库的字段名称长度规则。

    • 前缀!!db_bin ()函数-这会触发函数的处理或求值,返回复杂的公式。

    Df <- tbl(con, "flights") %>% group_by(x = !!Db_bin (sched_dep_time, bins = 10)) %>% tally() %>% collect() head(df)
    ## # A tibble: 6 x 2 ## x n ##   ## 1 782。599 ## 248864 ## 3 1007。38889 ## 4 106。1 ## 5 331。1908年。39942

    在R中绘制结果

    因为箱子已经在数据库上进行了预处理并从数据库中收集,所以使用结果很容易绘制geom_col ().生成的bin值为x每箱的计数是y

    Ggplot (data = df) + geom_col(aes(x = x, y = n))

    变换和情节

    就像Bar图一样,整个过程可以通过管道进行。下面是一个使用binwidth论点相反的垃圾箱;此外,垃圾箱的大小被扩大到300分钟的间隔:

    Tbl (con, "flights") %>% group_by(x = !!Db_bin (sched_dep_time, binwidth = 300)) %>% tally() %>% collect() %>% ggplot() + geom_col(aes(x = x, y = n))

    光栅图

    为了可视化两个连续变量,我们通常使用a散点图.然而,当用数百万或数十亿个点表示两个变量的交点时,这可能是不实际的。栅格图可能是一个更好的选择,因为它将交叉点集中成正方形,更容易从视觉上解析。

    栅格图基本上与直方图相同。它接受两个连续变量,并创建离散的二维箱子,在图中表示为正方形。然后,它确定每个方格内的行数,或者处理一些聚合,如平均值。

    数据转换

    用于创建直方图的helper函数也可以用于创建正方形。的db_bin ()函数用于内部的每个连续变量group_by (),但在这种情况下,数字如果垃圾箱增加到50:

    Df <- tbl(con, "flights") %>% group_by(sc_dep_time = !!Db_bin (sched_dep_time, bins = 50), sc_arr_time = !!Db_bin (sched_arr_time, bins = 50)) %>% summary (avg_distance = mean(距离))%>% collect()
    ##警告:SQL中总是会删除缺失的值。##使用' AVG(x, na。rm = TRUE)` to silence this warning
    头(df)
    ## # A tibble: 6 x 3 ## #组:sc_dep_time [6] ## sc_dep_time sc_arr_time avg_distance ##    ## 1 1953。2170.596.# # 2 2044。2123.201.# 1728 # 3。1887.496.# 1863 # 4。 2076. 687. ## 5 1638. 1793. 422. ## 6 737. 944. 593.

    在R中绘制结果

    现在可以使用geom_raster ().分配x而且y对每个连续变量的解释将取决于什么对给定的可视化更有意义。每个交集的结果作为使用的正方形的颜色传递填满

    Ggplot (data = df) + geom_光栅(aes(x = sc_dep_time, y = sc_arr_time, fill = avg_distance))

    注意事项

    在数据库中使用栅格图时,有两个注意事项。这两个考虑因素都与从数据库下载的结果的大小有关:

    • 的数量垃圾箱要求:越高垃圾箱取值为:从数据库中下载的数据越多。

    • 数据的集中程度:这指的是有多少个交集返回一个值。没有值的交集越多,从数据库中下载的数据就越少。

    在前面的示例中,最多有2,500行(50 x 50)。因为数据高度集中,所以只返回353条记录。这意味着数据将通过网络快速传输,但代价是图片定义可能并不理想,无法深入了解数据。

    在下面的示例中,“definition”设置为100 x 100。这提高了分辨率,但可能下载的记录数量增加了四倍。

    Tbl (con, "flights") %>% group_by(sc_dep_time = !!Db_bin (sched_dep_time, bins = 100), sc_arr_time = !!Db_bin (sched_arr_time, bins = 100)) %>% summarise(avg_distance = mean(distance)) %>% collect() %>% ggplot() + geom_raster(aes(x = sc_dep_time, y = sc_arr_time, fill = avg_distance))
    ##警告:SQL中总是会删除缺失的值。##使用' AVG(x, na。rm = TRUE)` to silence this warning

    使用R包

    dbplotPackage提供自动化聚合和绘图步骤的帮助函数。欲了解更多信息,请访问dbplot文章在这个网站。