我有两个表存储用户的登录尝试。一个表包含所有成功登录,另一个表包含失败尝试。我正在尝试使用失败登录计数和成功登录计数来创建堆积图表。这就是我的表格的样子:
Success_login表:
User_ID Site_Address Login_Attempts
1 xxx.xxx.xxx 5
2 xxx.xxy.yyy 10
Fail_login表:
User_ID Site_Address Login_Attempts
1 xxx.xxx.xxx 2
2 xxx.xxy.yyy 8
如何使用这两个表的Login_Attempts列创建堆叠图表,以便突出显示成功和失败尝试?我在网上找了这个代码:
# Stacked Bar Plot with Colors and Legend
counts <- table(mtcars$vs, mtcars$gear)
barplot(counts, main="Car Distribution by Gears and VS",
xlab="Number of Gears", col=c("darkblue","red"),
legend = rownames(counts))
然而,它不起作用,因为我的两个表有不同的记录数。如果您能引导我找到解决方案,我将不胜感激。
由于
答案 0 :(得分:1)
首先,您必须将数据统一到一个表中。如果您熟悉SQL,可以使用一种外连接来完成。见How to join (merge) data frames (inner, outer, left, right)?。生成的NA
s(对于未能加入对方表的记录)必须替换为零,以便最终调用barplot()
。
然后,您必须以barplot()
所需的格式导出矩阵,以生成堆积条形图,只需调用matrix()
即可轻松完成。注意正确设置标签/标题/图例/颜色,你可以得到一个很好的堆积条形图:
s <- data.frame(User_ID=c(1,2,3), Site_Address=c('xxx.xxx.xxx','xxx.xxy.yyy','xxx.yyy.zzz'), Login_Attempts=c(5,10,3) );
f <- data.frame(User_ID=c(1,2,4), Site_Address=c('xxx.xxx.xxx','xxx.xxy.yyy','xxx.yyy.zzz'), Login_Attempts=c(2,8,4) );
all <- merge(s,f,by=c('User_ID','Site_Address'),suffixes=c('.successful','.failed'),all=T);
all[is.na(all)] <- 0;
stackData <- matrix(c(all$Login_Attempts.failed, all$Login_Attempts.successful ),2,byrow=T);
colnames(stackData) <- paste0(all$User_ID, '@', all$Site_Address );
rownames(stackData) <- c('failed','successful');
barplot(stackData,main='Successful and failed login attempts',xlab='User_ID@Site_Address',ylab='Login_Attempts',col=c('red','blue'),legend=rownames(stackData));
r> s;
User_ID Site_Address Login_Attempts
1 1 xxx.xxx.xxx 5
2 2 xxx.xxy.yyy 10
3 3 xxx.yyy.zzz 3
r> f;
User_ID Site_Address Login_Attempts
1 1 xxx.xxx.xxx 2
2 2 xxx.xxy.yyy 8
3 4 xxx.yyy.zzz 4
r> all;
User_ID Site_Address Login_Attempts.successful Login_Attempts.failed
1 1 xxx.xxx.xxx 5 2
2 2 xxx.xxy.yyy 10 8
3 3 xxx.yyy.zzz 3 0
4 4 xxx.yyy.zzz 0 4
r> stackData;
1@xxx.xxx.xxx 2@xxx.xxy.yyy 3@xxx.yyy.zzz 4@xxx.yyy.zzz
failed 2 8 0 4
successful 5 10 3 0
编辑:创建单条堆叠条形图有点奇怪,但是好的,您可以使用上述数据({{{{{{{ 1}})作为基础:
all
编辑:是的,默认情况下,y轴应该完全覆盖堆栈,它不是基本图形包中的弱点。您可以将barplot(matrix(c(sum(all$Login_Attempts.failed),sum(all$Login_Attempts.successful))),main='Successful and failed login attempts',ylab='Login_Attempts',col=c('red','blue'),legend=c('failed','successful'));
作为参数添加到ylim=c(0,1.2*sum(do.call(c,all[,3:4])))
调用,以强制y轴延伸超出堆栈高点至少20%。 (很遗憾你必须从输入数据中手动计算,但正如我所说,这是包中的一个弱点。)
另外,关于我对条形一致性的评论,对于用于比较多个条形而不是显示单个条形的堆叠条形图,它更常见。 (这就是为什么我最初的假设是你想为每个用户/网站设置一个单独的栏。)而不是单个堆叠栏,通常你会看到一个简单的旧条形图,显示不同的数据点 - 通过边。但这实际上取决于您的应用,所以最适合您的是什么。
答案 1 :(得分:0)
barplot
创建结果。请记住包含特殊情况,例如用户只有登录成功或失败的地方。步骤2的结果是您需要的可重复示例,以便在此处提出一个明智的问题。 第3步是你在这里问的问题,但似乎你不确定中间结果应该是什么样子。 第1步是关于最终产品的可视化,并从那里开始工作。