使用 R 和 ggplot2 有没有更好的方法来可视化 TRUE 和 FALSE 布尔值列?

Using R and ggplot2 is there a better way to visualize TRUE and FALSE Boolean Value columns?

提问人:EliCash 提问时间:9/29/2022 最后编辑:EliCash 更新时间:9/30/2022 访问量:405

问:

所以我有一个更大的数据集,但为了简单起见,我尽了最大努力提供我的问题/数据集的简化版本:

所以总共有3只小猪。其中一头猪只拥有一栋房子,我想在 Y 轴上绘制房屋总价值,然后是每头猪拥有多少的分面视图。

房子 房屋价值 猪1 猪2 猪3
干草 30000
70000
100000

这是我想要的这个样子的快速草图:enter image description here

我对我的 R 用法以及我的 GGPLOT2 用法非常生疏。我正在用这些数据做各种疯狂的事情,例如:

library(ggplot2)
library(readr)
piggies <- read_csv("piggies.csv")
ggplot(piggies, aes(x=PIG1, fill=as.factor(HOUSEVALUE)))+geom_bar(position='dodge')
ggplot(piggies, aes(x=PIG2, fill=as.factor(HOUSEVALUE)))+geom_bar(position='dodge')

enter image description here

enter image description here

我知道上面的 ggplot2 可视化效果近乎疯狂,但我最难追踪布尔值列的可靠资源并使 Y 轴表示“计数”以外的其他内容

(编辑了示例GGPlot公式,使其比我的原始示例略少疯狂)

r ggplot2 布尔 可视化 逻辑

评论

0赞 akrun 9/29/2022
尝试或可能是df1 %>% pivot_longer(cols = starts_with('PIG')) %>% filter(value) %>% ggplot(aes(x = name, y = HOUSEVALUE, fill = HOUSES)) + geom_col() + facet_wrap(~ HOUSES)df1 %>% pivot_longer(cols = starts_with('PIG')) %>% mutate(value = factor(value)) %>% ggplot(aes(x = name, y = HOUSEVALUE, fill = value)) + geom_col() + facet_wrap(~ HOUSES)
0赞 Limey 9/29/2022
好吧,你的手绘草图在 y 轴上有房屋价值,而你当前的地块在 y 轴上有房屋价值,所以这是一个很好的起点。此外,ggplot 作为 tidyverse 的一部分,旨在处理整洁数据。您的数据集不整洁,因为您的列名中有信息(猪名)。使您的数据整洁,您将不需要任何布尔值,您的生活将变得更加简单。您还可以调查 和 之间的区别。geom_histogramgeom_bar
0赞 EliCash 9/29/2022
Limey - 公平的观点,我不认为我离得很近,我想我会编辑那个样本,只是想放一些东西......但我很欣赏这个链接,我将研究如何优化我的 CSV 文件。
0赞 EliCash 9/29/2022
阿克伦,我试过了,但收到了Error in df1 %>% pivot_longer(cols = starts_with("PIG")) %>% filter(value) %>% : could not find function "%>%"
0赞 EliCash 9/30/2022
@Limey 您将如何使这些特定数据整洁?

答:

1赞 Silentdevildoll 9/30/2022 #1

我不确定这是否是你要找的,它会给出每头猪拥有的每种类型的堆叠总量。与@Akrun所说的类似,它在绘图之前使用pivot_longer:

dat<-data.frame("HOUSES" = c("Hay", "Sticks", "Bricks"), "HOUSEVALUE" = c(30000, 70000, 100000), "PIG1" = c(T,T,T), "PIG2" = c(F,T,T), "PIG3" = c(F,F,T))


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

dat%>%
  pivot_longer(cols = starts_with("PIG"))%>%
  filter(value)%>%
  ggplot()+
  aes(name, HOUSEVALUE, fill = HOUSES)+
  geom_bar(stat = "identity")

评论

0赞 EliCash 9/30/2022
这对我有用,我真的很感激。但是,有没有办法这样做: - 这给了我一个错误,但是我计划使用这种方法的一些更大的数据与名称都不同。pivot_longer(cols = PIG1, PIG2)%>%
1赞 Silentdevildoll 9/30/2022
我需要多个名称的方法是使用 ,所以用这一行替换 ,您可以在其中用 |greppivot_longerpivot_longer(cols = grep("PIG1|PIG2|PIG3", names(.)))
0赞 EliCash 9/30/2022
虽然这对我的初始视觉效果非常有效,但有没有办法在不使用 pivot_longer 方法的情况下做到这一点?即使需要更改数据的布局方式?
0赞 Silentdevildoll 10/1/2022
如果您正在寻找 的替代方案,那么还有其他选择(这些是 ,但我认为它证明了我的观点):stackoverflow.com/questions/67778341/...pivot_longerpivot_wider
0赞 Silentdevildoll 10/1/2022
如果你试图避免重塑数据,那么我不太确定你该怎么做。我能想到的最好的是.但这不是自动化的,所以你必须弄清楚如何输入这些 0。dat%>% ggplot()+ geom_bar(aes(x = "PIG1", y = HOUSEVALUE[PIG1], fill = HOUSES), stat = "identity")+ geom_bar(aes(x = "PIG2", y = c(0,HOUSEVALUE[PIG2]), fill = HOUSES), stat = "identity")+ geom_bar(aes(x = "PIG3", y = c(0,0,HOUSEVALUE[PIG3]), fill = HOUSES), stat = "identity")