具有多个箱和组的直方图
Histogram with multiple bins and groups
我正在尝试在 R 中重现在 excel 中创建的这三个简单直方图,以便稍微吸引眼球。我毫不怀疑这很简单,但我不习惯使用 R。
[
我找到了生成基本直方图的不同教程,但还没有找到可以为每个距离箱生成三列(代表年份),然后为每个数据组生成三个单独的图表的东西(A , B, C).
我相信我需要做的第一件事是重构我的数据,我想这是我不确定的步骤。
提前致谢。
使用一些随机示例数据,以下代码是一个 tidyverse
解决方案,它为您提供了一个条形图或柱形图(因为您的数据已经分箱,这是要走的路)模仿您的 excel一个数据集的图表。正如您已经猜到的那样,棘手的部分是将数据导入 R(为此:查看 readxl
包)并重新排列它以进行绘图(这是通过 pivot_longer
从 tidyr
包和 dplyr
中的 mutate
都是 tidyverse
的一部分。至于绘图部分,我使用 ggplot2
这是 - 你可能已经猜到了( ; - 也是 tidyverse
.
的一部分
# Example data set
set.seed(42)
df <- data.frame(
distance = paste0(seq(0, 3.5, by = 0.5), "-", seq(0.5, 4, by = 0.5)),
`2015` = round(runif(8) * 8, 0),
`2016` = round(runif(8) * 8, 0),
`2017` = round(runif(8) * 8, 0)
)
df
#> distance X2015 X2016 X2017
#> 1 0-0.5 7 5 8
#> 2 0.5-1 7 6 1
#> 3 1-1.5 2 4 4
#> 4 1.5-2 7 6 4
#> 5 2-2.5 5 7 7
#> 6 2.5-3 4 2 1
#> 7 3-3.5 6 4 8
#> 8 3.5-4 1 8 8
library(tidyverse)
df %>%
# Convert the dataset to long format
pivot_longer(-distance, names_to = "Year", values_to = "Value") %>%
# format the dates, get rid of leading Xs
mutate(Year = gsub("^X", "", Year)) %>%
ggplot(aes(distance, Value, fill = Year)) +
# Column chart. Add some width between columns
geom_col(position = position_dodge2(2)) +
scale_y_continuous(expand = expansion(mult = c(0, .05))) +
scale_fill_manual(values = c("blue", "orange", "grey")) +
# Get rid of axis and legend labels
labs(y = "", x = "", fill = "") +
theme_bw() +
theme(legend.position = "bottom")
由 reprex package (v0.3.0)
于 2020-04-05 创建
是的,您将不得不重组您的数据。您可以按照@stefan 所示在 R 中完成,或者如果它具有挑战性,您可以在 excel 本身中完成。整洁的数据易于绘制和分析(请参阅 section 12.1 for tidy data and section 3.7, 3.8 进行可视化)。整齐的数据看起来像是由四列组成 - 距离、值、Value_year、Value_group。
例如,我将一些数据存储为制表符分隔文件 (testdata.txt) 并使用 tidyverse 的 read_delim 函数读取。以下是示例代码:
library(tidyverse)
foo <- read_delim("testdata.txt", delim = "\t")
foo %>% mutate(Val_year = factor(Val_year, levels=c("2015","2016","2017"))) %>%
ggplot() + geom_bar(aes(x=Dist, y=Val, fill = Val_year), stat = "identity", position = "dodge") + facet_grid(.~Val_grp)
我正在尝试在 R 中重现在 excel 中创建的这三个简单直方图,以便稍微吸引眼球。我毫不怀疑这很简单,但我不习惯使用 R。
[
我找到了生成基本直方图的不同教程,但还没有找到可以为每个距离箱生成三列(代表年份),然后为每个数据组生成三个单独的图表的东西(A , B, C).
我相信我需要做的第一件事是重构我的数据,我想这是我不确定的步骤。
提前致谢。
使用一些随机示例数据,以下代码是一个 tidyverse
解决方案,它为您提供了一个条形图或柱形图(因为您的数据已经分箱,这是要走的路)模仿您的 excel一个数据集的图表。正如您已经猜到的那样,棘手的部分是将数据导入 R(为此:查看 readxl
包)并重新排列它以进行绘图(这是通过 pivot_longer
从 tidyr
包和 dplyr
中的 mutate
都是 tidyverse
的一部分。至于绘图部分,我使用 ggplot2
这是 - 你可能已经猜到了( ; - 也是 tidyverse
.
# Example data set
set.seed(42)
df <- data.frame(
distance = paste0(seq(0, 3.5, by = 0.5), "-", seq(0.5, 4, by = 0.5)),
`2015` = round(runif(8) * 8, 0),
`2016` = round(runif(8) * 8, 0),
`2017` = round(runif(8) * 8, 0)
)
df
#> distance X2015 X2016 X2017
#> 1 0-0.5 7 5 8
#> 2 0.5-1 7 6 1
#> 3 1-1.5 2 4 4
#> 4 1.5-2 7 6 4
#> 5 2-2.5 5 7 7
#> 6 2.5-3 4 2 1
#> 7 3-3.5 6 4 8
#> 8 3.5-4 1 8 8
library(tidyverse)
df %>%
# Convert the dataset to long format
pivot_longer(-distance, names_to = "Year", values_to = "Value") %>%
# format the dates, get rid of leading Xs
mutate(Year = gsub("^X", "", Year)) %>%
ggplot(aes(distance, Value, fill = Year)) +
# Column chart. Add some width between columns
geom_col(position = position_dodge2(2)) +
scale_y_continuous(expand = expansion(mult = c(0, .05))) +
scale_fill_manual(values = c("blue", "orange", "grey")) +
# Get rid of axis and legend labels
labs(y = "", x = "", fill = "") +
theme_bw() +
theme(legend.position = "bottom")
由 reprex package (v0.3.0)
于 2020-04-05 创建是的,您将不得不重组您的数据。您可以按照@stefan 所示在 R 中完成,或者如果它具有挑战性,您可以在 excel 本身中完成。整洁的数据易于绘制和分析(请参阅 section 12.1 for tidy data and section 3.7, 3.8 进行可视化)。整齐的数据看起来像是由四列组成 - 距离、值、Value_year、Value_group。
例如,我将一些数据存储为制表符分隔文件 (testdata.txt) 并使用 tidyverse 的 read_delim 函数读取。以下是示例代码:
library(tidyverse)
foo <- read_delim("testdata.txt", delim = "\t")
foo %>% mutate(Val_year = factor(Val_year, levels=c("2015","2016","2017"))) %>%
ggplot() + geom_bar(aes(x=Dist, y=Val, fill = Val_year), stat = "identity", position = "dodge") + facet_grid(.~Val_grp)