我希望能够显示任何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创建
答案 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
要获取绘制后的数据,我们使用gg <- ggplot(df, aes(x, y, colour = group)) +
geom_point() +
geom_line()
gg
ggplot_build
请注意pb <- ggplot_build(gg)
是一个pb
,其中包含两个几何对象list
和geom_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
标签。