使用二进制数据创建条形图

Posted

技术标签:

【中文标题】使用二进制数据创建条形图【英文标题】:Creating bar charts with binary data 【发布时间】:2022-01-13 01:21:55 【问题描述】:

我有以下数据,我试图用它来创建一个条形图,以显示水果的偏好如何随国家/地区而变化:

see data table here

我想创建一个条形图,显示基于调查位置的苹果、橙子、葡萄和香蕉的偏好(即 x=surveyloc 和 Y =橙子、苹果、香蕉的首选频率)。在处理二进制数据时,我不太确定如何执行此操作,希望能得到一些帮助。

【问题讨论】:

参考这里'community.rstudio.com/t/trouble-with-bar-chart-binary-data/… 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

如果您希望查看跨多个位置(例如位置)的多个变量(例如水果)的偏好,当只有二进制数据(“是”或“否”,或 0 与 1)时,条形图可能不是最好的选择。我的建议类似于平铺图,以便您可以一目了然地传达各个位置的偏好。这是一个使用一些虚拟数据的示例。我将首先向您展示一个条形图(柱形图)的示例,然后是我给您的建议,那就是瓦片地图。

示例数据集

library(ggplot2)
library(dplyr)
library(tidyr)

set.seed(8675309)
df <- data.frame(
  location = state.name[1:10],
  apples = rbinom(10,1,0.3),
  oranges = rbinom(10,1,0.1),
  pears = rbinom(10,1,0.25),
  grapes = rbinom(10,1,0.6),
  mangos = rbinom(10,1,0.65)
)

# tidy data
df <- df %>% pivot_longer(cols = -location) %>%
  mutate(value = factor(value))

我最初在上面创建了 df,格式与您为数据集 (location | pref1 | pref2 | pref3 | ...) 使用的格式相同。很难使用ggplot2 轻松绘制此类数据,因为它旨在处理所谓的Tidy Data。总体而言,这是一种更好的数据管理策略,并且可以适应您希望的任何输出 - 我建议阅读该小插图以获取更多信息。不用说,在上面的代码之后,我们将df 格式化为“整洁”的表格。

注意,我还将二进制“值”列转换为因子(因为它只包含“0”或“1”,而“0.5”等值在此数据中没有意义) .

“条形图”

我将“条形图”放在引号中,因为当我们在 y 轴上绘制值(0 或 1)并在 x 轴上绘制位置时,我们正在创建一个“柱形图”。 “条形图”形式上只需要一个值列表,并在 y 轴上绘制计数、密度或概率。无论如何,这里有一个例子:

bar_plot <-
  df %>%
  ggplot(aes(x=location, y=value, fill=name)) +
  geom_col(position="dodge", color='gray50', width=0.7) +
  scale_fill_viridis_d()
bar_plot

我们可以考虑只显示value==1 的位置,但这可能不会让事情变得更清楚。

平铺图示例

我认为在这里效果更好的是瓷砖地图。这个想法是您在 x 轴上传播 location,在 y 轴上传播 name(水果),然后将 value 字段显示为结果图块的颜色。我认为它使事情更容易查看,如果您的数据是二进制或概率数据,它的工作方式应该几乎相同。对于概率数据,您无需先转换为因子。

tile_plot <-
df %>%
  ggplot(aes(x=location, y=name, fill=value)) +
  geom_tile(color='black') +
  scale_fill_manual(values=c(`0`="gray90", `1`="skyblue")) +
  coord_fixed() +
  scale_x_discrete(expand=expansion(0)) +
  scale_y_discrete(expand=expansion(0))
tile_plot

为了解释一下这里发生了什么,我们按照上面ggplot(...) 中的说明设置了美学。然后我们用geom_tile() 绘制瓷砖,其中color= 代表瓷砖周围的线。实际的填充颜色在scale_fill_manual() 中描述。通过coord_fixed() 将图块强制为“正方形”,然后通过scale_x_*()scale_y_*() 命令删除图块周围的多余区域。

【讨论】:

以上是关于使用二进制数据创建条形图的主要内容,如果未能解决你的问题,请参考以下文章

二进制列总计为ggplot中堆积的条形图的百分比

ran128条码中应用标识符()11)数据含义

Halcon学习笔记——条形码的定位与识别

iOS11 增加的新技能

Mysql数据库备份与恢复

从一开始就使用一元/二进制数据创建一个 csr_matrix