使用二进制数据创建条形图
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_*()
命令删除图块周围的多余区域。
【讨论】:
以上是关于使用二进制数据创建条形图的主要内容,如果未能解决你的问题,请参考以下文章