如何显示显示的ggplot()数据表

时间:2019-03-04 21:00:18

标签: r ggplot2

我希望能够显示任何ggplot数据的表。在不进行任何计算的情况下,这相对容易,但是在计算统计信息时,要困难得多。

我想知道对于任何类型的表,或者至少对于条形表({{1},geom_bar(),{{1 }}。

geom_col()

当不计算任何统计信息时,这相对容易

geom_histogram()

但是当我们有一个统计数据时,这并不是那么容易:

require(tidyverse)
#> Loading required package: tidyverse
#geom_col
mtcars %>% 
  mutate(vs = as.factor(vs)) %>% 
  count(vs, carb) %>% 
  ggplot(aes(x = carb, y = n, fill = vs)) + geom_col()

last_plot()$data
#> # A tibble: 8 x 3
#>   vs     carb     n
#>   <fct> <dbl> <int>
#> 1 0         2     5
#> 2 0         3     3
#> 3 0         4     8
#> 4 0         6     1
#> 5 0         8     1
#> 6 1         1     7
#> 7 1         2     5
#> 8 1         4     2

在这里,我们有所追求的,但是我们不知道什么是“组”,因此需要重新连接。

#geom_histogram
mtcars %>% 
  mutate(vs = as.factor(vs)) %>% 
  ggplot(aes(x = hp, fill = vs)) + geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

reprex package(v0.2.1)于2019-03-04创建

当我们具有刻面,颜色等时,它可能会变得更加复杂。

编辑更新:

抱歉,目前尚不清楚。 last_plot()$data #This isn't what we want, since there was a calculated stat. #> mpg cyl disp hp drat wt qsec vs am gear carb #> 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 #> 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 #> 3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 #> 4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 #> 5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 #> 6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 #> 7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 #> 8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 #> 9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 #> 10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 #> 11 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 #> 12 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 #> 13 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 #> 14 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 #> 15 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 #> 16 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 #> 17 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 #> 18 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 #> 19 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 #> 20 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 #> 21 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 #> 22 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 #> 23 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 #> 24 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 #> 25 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 #> 26 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 #> 27 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 #> 28 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 #> 29 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 #> 30 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 #> 31 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 #> 32 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 是填充的糟糕选择,因为它恰好是数字。这是一个略有改进的版本,显示当填充值是字符时,您仍会获得组的数字值。

gb <- ggplot_build(last_plot())$data[[1]]
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


gb %>% select(y, count, x, group)
#>    y count         x group
#> 1  1     1  48.79310     2
#> 2  1     0  48.79310     1
#> 3  1     1  58.55172     2
#> 4  1     0  58.55172     1
#> 5  3     3  68.31034     2
#> 6  3     0  68.31034     1
#> 7  0     0  78.06897     2
#> 8  0     0  78.06897     1
#> 9  0     0  87.82759     2
#> 10 1     1  87.82759     1
#> 11 3     3  97.58621     2
#> 12 3     0  97.58621     1
#> 13 3     3 107.34483     2
#> 14 5     2 107.34483     1
#> 15 1     1 117.10345     2
#> 16 1     0 117.10345     1
#> 17 2     2 126.86207     2
#> 18 2     0 126.86207     1
#> 19 0     0 136.62069     2
#> 20 0     0 136.62069     1
#> 21 0     0 146.37931     2
#> 22 2     2 146.37931     1
#> 23 0     0 156.13793     2
#> 24 0     0 156.13793     1
#> 25 0     0 165.89655     2
#> 26 0     0 165.89655     1
#> 27 0     0 175.65517     2
#> 28 6     6 175.65517     1
#> 29 0     0 185.41379     2
#> 30 0     0 185.41379     1
#> 31 0     0 195.17241     2
#> 32 0     0 195.17241     1
#> 33 0     0 204.93103     2
#> 34 1     1 204.93103     1
#> 35 0     0 214.68966     2
#> 36 1     1 214.68966     1
#> 37 0     0 224.44828     2
#> 38 0     0 224.44828     1
#> 39 0     0 234.20690     2
#> 40 1     1 234.20690     1
#> 41 0     0 243.96552     2
#> 42 2     2 243.96552     1
#> 43 0     0 253.72414     2
#> 44 0     0 253.72414     1
#> 45 0     0 263.48276     2
#> 46 1     1 263.48276     1
#> 47 0     0 273.24138     2
#> 48 0     0 273.24138     1
#> 49 0     0 283.00000     2
#> 50 0     0 283.00000     1
#> 51 0     0 292.75862     2
#> 52 0     0 292.75862     1
#> 53 0     0 302.51724     2
#> 54 0     0 302.51724     1
#> 55 0     0 312.27586     2
#> 56 0     0 312.27586     1
#> 57 0     0 322.03448     2
#> 58 0     0 322.03448     1
#> 59 0     0 331.79310     2
#> 60 1     1 331.79310     1

vs

reprex package(v0.2.1)于2019-03-04创建

======================

编辑2 根据要求,这是我想要做的一个更清洁的工作示例:

mtcars %>% 
  mutate(vs = case_when(vs == 0 ~ "random",
                        vs == 1 ~ "character label")) %>% 
  ggplot(aes(x = hp, fill = vs)) + geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

last_plot()$data #This isn't what we want, since there was a calculated stat.
#>     mpg cyl  disp  hp drat    wt  qsec              vs am gear carb
#> 1  21.0   6 160.0 110 3.90 2.620 16.46          random  1    4    4
#> 2  21.0   6 160.0 110 3.90 2.875 17.02          random  1    4    4
#> 3  22.8   4 108.0  93 3.85 2.320 18.61 character label  1    4    1
#> 4  21.4   6 258.0 110 3.08 3.215 19.44 character label  0    3    1
#> 5  18.7   8 360.0 175 3.15 3.440 17.02          random  0    3    2
#> 6  18.1   6 225.0 105 2.76 3.460 20.22 character label  0    3    1
#> 7  14.3   8 360.0 245 3.21 3.570 15.84          random  0    3    4
#> 8  24.4   4 146.7  62 3.69 3.190 20.00 character label  0    4    2
#> 9  22.8   4 140.8  95 3.92 3.150 22.90 character label  0    4    2
#> 10 19.2   6 167.6 123 3.92 3.440 18.30 character label  0    4    4
#> 11 17.8   6 167.6 123 3.92 3.440 18.90 character label  0    4    4
#> 12 16.4   8 275.8 180 3.07 4.070 17.40          random  0    3    3
#> 13 17.3   8 275.8 180 3.07 3.730 17.60          random  0    3    3
#> 14 15.2   8 275.8 180 3.07 3.780 18.00          random  0    3    3
#> 15 10.4   8 472.0 205 2.93 5.250 17.98          random  0    3    4
#> 16 10.4   8 460.0 215 3.00 5.424 17.82          random  0    3    4
#> 17 14.7   8 440.0 230 3.23 5.345 17.42          random  0    3    4
#> 18 32.4   4  78.7  66 4.08 2.200 19.47 character label  1    4    1
#> 19 30.4   4  75.7  52 4.93 1.615 18.52 character label  1    4    2
#> 20 33.9   4  71.1  65 4.22 1.835 19.90 character label  1    4    1
#> 21 21.5   4 120.1  97 3.70 2.465 20.01 character label  0    3    1
#> 22 15.5   8 318.0 150 2.76 3.520 16.87          random  0    3    2
#> 23 15.2   8 304.0 150 3.15 3.435 17.30          random  0    3    2
#> 24 13.3   8 350.0 245 3.73 3.840 15.41          random  0    3    4
#> 25 19.2   8 400.0 175 3.08 3.845 17.05          random  0    3    2
#> 26 27.3   4  79.0  66 4.08 1.935 18.90 character label  1    4    1
#> 27 26.0   4 120.3  91 4.43 2.140 16.70          random  1    5    2
#> 28 30.4   4  95.1 113 3.77 1.513 16.90 character label  1    5    2
#> 29 15.8   8 351.0 264 4.22 3.170 14.50          random  1    5    4
#> 30 19.7   6 145.0 175 3.62 2.770 15.50          random  1    5    6
#> 31 15.0   8 301.0 335 3.54 3.570 14.60          random  1    5    8
#> 32 21.4   4 121.0 109 4.11 2.780 18.60 character label  1    4    2

gb <- ggplot_build(last_plot())$data[[1]]
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#Here we have what we're after, but we don't know what "group" is what so that needs to be reconnected.
gb %>% select(y, count, x, group)
#>    y count         x group
#> 1  0     0  48.79310     2
#> 2  1     1  48.79310     1
#> 3  0     0  58.55172     2
#> 4  1     1  58.55172     1
#> 5  0     0  68.31034     2
#> 6  3     3  68.31034     1
#> 7  0     0  78.06897     2
#> 8  0     0  78.06897     1
#> 9  1     1  87.82759     2
#> 10 1     0  87.82759     1
#> 11 0     0  97.58621     2
#> 12 3     3  97.58621     1
#> 13 2     2 107.34483     2
#> 14 5     3 107.34483     1
#> 15 0     0 117.10345     2
#> 16 1     1 117.10345     1
#> 17 0     0 126.86207     2
#> 18 2     2 126.86207     1
#> 19 0     0 136.62069     2
#> 20 0     0 136.62069     1
#> 21 2     2 146.37931     2
#> 22 2     0 146.37931     1
#> 23 0     0 156.13793     2
#> 24 0     0 156.13793     1
#> 25 0     0 165.89655     2
#> 26 0     0 165.89655     1
#> 27 6     6 175.65517     2
#> 28 6     0 175.65517     1
#> 29 0     0 185.41379     2
#> 30 0     0 185.41379     1
#> 31 0     0 195.17241     2
#> 32 0     0 195.17241     1
#> 33 1     1 204.93103     2
#> 34 1     0 204.93103     1
#> 35 1     1 214.68966     2
#> 36 1     0 214.68966     1
#> 37 0     0 224.44828     2
#> 38 0     0 224.44828     1
#> 39 1     1 234.20690     2
#> 40 1     0 234.20690     1
#> 41 2     2 243.96552     2
#> 42 2     0 243.96552     1
#> 43 0     0 253.72414     2
#> 44 0     0 253.72414     1
#> 45 1     1 263.48276     2
#> 46 1     0 263.48276     1
#> 47 0     0 273.24138     2
#> 48 0     0 273.24138     1
#> 49 0     0 283.00000     2
#> 50 0     0 283.00000     1
#> 51 0     0 292.75862     2
#> 52 0     0 292.75862     1
#> 53 0     0 302.51724     2
#> 54 0     0 302.51724     1
#> 55 0     0 312.27586     2
#> 56 0     0 312.27586     1
#> 57 0     0 322.03448     2
#> 58 0     0 322.03448     1
#> 59 1     1 331.79310     2
#> 60 1     0 331.79310     1

reprex package(v0.2.1)于2019-03-04创建

1 个答案:

答案 0 :(得分:0)

我仍然不清楚你在追求什么。

让我们考虑以下最小样本数据

set.seed(2018)
df <- data.frame(
    x = sample(10),
    y = sample(10),
    group = sample(c("a", "b"), 10, replace = T))
#    x  y group
#1   4  4     a
#2   5  6     b
#3   1  8     a
#4   2  5     a
#5   3  7     b
#6   7 10     b
#7   6  2     a
#8   8  9     b
#9   9  3     b
#10 10  1     a

在此示例中,df$group是具有两个级别factor"a"的{​​{1}}。

我们现在绘制"b",并在df上添加另外的colour美学映射

df$group

enter image description here

要获取绘制后的数据,我们使用gg <- ggplot(df, aes(x, y, colour = group)) + geom_point() + geom_line() gg

ggplot_build

请注意pb <- ggplot_build(gg) 是一个pb,其中包含两个几何对象listgeom_point的两个元素。

要提取数据并将geom_line映射回我们的group标签,我们可以执行以下操作

df$group

在这里,我将pb$data[[1]] %>% mutate(group_label = levels(df$group)[group]) # colour x y PANEL group shape size fill alpha stroke group_label #1 #F8766D 4 4 1 1 19 1.5 NA NA 0.5 a #2 #00BFC4 5 6 1 2 19 1.5 NA NA 0.5 b #3 #F8766D 1 8 1 1 19 1.5 NA NA 0.5 a #4 #F8766D 2 5 1 1 19 1.5 NA NA 0.5 a #5 #00BFC4 3 7 1 2 19 1.5 NA NA 0.5 b #6 #00BFC4 7 10 1 2 19 1.5 NA NA 0.5 b #7 #F8766D 6 2 1 1 19 1.5 NA NA 0.5 a #8 #00BFC4 8 9 1 2 19 1.5 NA NA 0.5 b #9 #00BFC4 9 3 1 2 19 1.5 NA NA 0.5 b #10 #F8766D 10 1 1 1 19 1.5 NA NA 0.5 a 中的条目映射回实际的group标签。