R “如何绘制”;计数“;及;“身份”;在同一图表中

R “如何绘制”;计数“;及;“身份”;在同一图表中,r,ggplot2,R,Ggplot2,我有一个十进制数字列表,范围从1到40K,我正在尝试绘制一个频率直方图以及给定的bin的总和。我正试图使用ggplot2来实现这一点,但在如何使用直方图中相同的x轴存储箱方面迷失了方向: sales <- data.frame(amount = runif(100, min=0, max=40000)) h <- hist(sales$amount, breaks=b) sales$groups <- cut(sales$amount, breaks=h$breaks) ggp

我有一个十进制数字列表,范围从1到40K,我正在尝试绘制一个频率直方图以及给定的
bin
的总和。我正试图使用
ggplot2
来实现这一点,但在如何使用直方图中相同的x轴存储箱方面迷失了方向:

sales <- data.frame(amount = runif(100, min=0, max=40000))
h <- hist(sales$amount, breaks=b)
sales$groups <- cut(sales$amount, breaks=h$breaks)
ggplot(sales,aes(x=groups)) + 
  geom_bar(stat="count")+
  geom_bar(aes(x=groups, y=amount), stat="identity") +
  scale_y_continuous(sec.axis = sec_axis(~.*5, name = "sum"))

sales如果我理解正确,您尝试在条形图中绘制两个不同的变量(Count和Sum)。因为它们的范围不同,所以需要定义一个次y轴

首先,
ggplot2
的语法要求一列代表x值,一列代表y值,一列或几列代表组(我对
ggplot2
的工作原理做了一个非常简短的总结)

这里的想法是将“breaks”作为x变量,第二列显示所有y值,第二列规定y值是否属于组“Count”或“amount”。您可以使用
dplyr
tidyr
软件包实现这一点:

set.seed(123)
销售额%
pivot_longer(,cols=c(计数,金额),名称_to=“Variable”,值_to=“Value”)
#一个tibble:200x3
#分组:分组[4]
组变量值
1(1e+04,2e+04)计数27
2(1e+04,2e+04)金额11503。
3(3e+04,4e+04]计数27
4(3e+04,4e+04)金额31532。
5(1e+04,2e+04)计数27
6(1e+04,2e+04)金额16359。
7(3e+04,4e+04)计数27
8(3e+04,4e+04)金额35321。
9(3e+04,4e+04)计数27
10(3e+04,4e+04)金额37619。
#…还有190行
但是,如果您试图直接绘制此曲线,您将得到一个糟糕的曲线图,其中“Count”的条形图与“amount”相比非常小:

库(ggplot2)
图书馆(tidyr)
图书馆(dplyr)
销售额%>%group_by(groups)%%>%mutate(Count=n())%%>%
pivot_longer(,cols=c(Count,amount),name_to=“Variable”,values_to=“Value”)%>%
ggplot(aes(x=组,y=值,填充=变量))+
几何图形栏(stat=“identity”,position=position\u dodge())

因此,您可以尝试使用
scale\u y\u continuous
中的
sec.axis
参数传递次y轴。但是,这不会改变您的绘图,它只会创建一个“假”右轴,通过您传递给参数的值对比例进行修改
sec.axis

因此,如果您想让这两组值在图形上都可见,您需要缩小“数量”或放大“计数”,以便这两组值具有相似的范围

在这里,由于您希望求和位于右轴上,我们将缩小“求和”的比例,以便它得到与“计数”值相同范围内的值

在图表上,您可以看到“数量”值达到40000左右,而“计数”的最大值为30。因此,您可以选择以下比例因子:40000/30=1333.333

因此,现在,如果您创建第二个名为“Amount”的列,它是“Amount”除以1300的结果,那么“Amount”和“Count”在同一范围内。因此,您的数据现在如下所示:

库(dplyr)
图书馆(tidyr)
销售额%>%group_by(groups)%%>%mutate(Count=n())%%>%
突变(数量=数量/1300)%>%
pivot_longer(,cols=c(计数,金额),名称_to=“Variable”,值_to=“Value”)
#一个tibble:200x4
#分组:分组[4]
金额组变量值
12400.(2e+04,3e+04)计数30
22400.(2e+04,3e+04)金额18.5
3 13313.(1e+04,2e+04)计数30
4 13313.(1e+04,2e+04)金额10.2
5 19545.(1e+04,2e+04)计数30
6 19545.(1e+04,2e+04)金额15.0
738179.(3e+04,4e+04)计数20
838179.(3e+04,4e+04)金额29.4
9 19316.(1e+04,2e+04)计数30
10 19316.(1e+04,2e+04)金额14.9
#…还有190行
为了使次y轴反映“数量”值的真实情况,可以传递相反的比例因子并将其乘以1300

总之,您将获得以下代码:

库(ggplot2)
图书馆(dplyr)
图书馆(tidyr)
销售额%>%group_by(groups)%%>%mutate(Count=n())%%>%
突变(数量=数量/1300)%>%
pivot\u更长(.,cols=c(计数,金额),名称\u to=“Variable”,值\u to=“Value”)%%%
ggplot(aes(x=组,y=值,填充=变量))+
几何图形栏(stat=“identity”,position=position\u dodge())+
连续缩放(name=“Count”,秒轴=秒轴(~*1300,name=“Sum”))

因此,您有一种错觉,即在两个不同的比例上绘制两组不同的值


希望这个冗长的解释对您有所帮助。

您能定义什么是
vendas
b
组吗?@dc37抱歉,我的草稿代码中遗漏了变量名称。修复了,数据代表了一些销售历史。这太棒了。谢谢您,我会花时间消化它。很高兴它看起来像您要找的。如果你有任何问题,请随时提问;)哈哈;)我应该更详细地解释一下。1300是一个任意比例,我选择最大计数和最大总和接近(您可以看到40000/300。实际上,我们并不是告诉ggplot绘制y1和y2。我们是告诉绘制两组的y,我使用“金额”的缩放值与“计数”处于相同的范围内。)。我将在今天晚些时候编辑我的帖子,以更深入地解释我所做的事情。我编辑了我的答案,以便更详细地描述比例因子和秒轴的使用。希望能有所帮助。让我知道它是否正常,或者是否有阴影部分;)