具有多个箱和组的直方图

Histogram with multiple bins and groups

我正在尝试在 R 中重现在 excel 中创建的这三个简单直方图,以便稍微吸引眼球。我毫不怀疑这很简单,但我不习惯使用 R。

[

我找到了生成基本直方图的不同教程,但还没有找到可以为每个距离箱生成三列(代表年份),然后为每个数据组生成三个单独的图表的东西(A , B, C).
我相信我需要做的第一件事是重构我的数据,我想这是我不确定的步骤。

提前致谢。

使用一些随机示例数据,以下代码是一个 tidyverse 解决方案,它为您提供了一个条形图或柱形图(因为您的数据已经分箱,这是要走的路)模仿您的 excel一个数据集的图表。正如您已经猜到的那样,棘手的部分是将数据导入 R(为此:查看 readxl 包)并重新排列它以进行绘图(这是通过 pivot_longertidyr 包和 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)