我有以下数据
dati <- read.table(text="
class num
1 0.0 63530
2 2.5 27061
3 3.5 29938
4 4.5 33076
5 5.6 45759
6 6.5 72794
7 8.0 153177
8 10.8 362124
9 13.5 551051
10 15.5 198634
")
Run Code Online (Sandbox Code Playgroud)
我想生成一个具有可变大小区间的直方图,以便每个条形区域反映每个区间的总数(num).我试过了
bins <- c(0,4,8,11,16)
p <- ggplot(dati) +
geom_histogram(aes(x=class,weight=num),breaks = bins)
Run Code Online (Sandbox Code Playgroud)
然而,这产生直方图,其中每个条的长度等于每个箱的总数.因为箱宽度是可变的,所以区域与数量不成比例.我无法在ggplot2中解决这个明显容易出问题的问题.谁能帮我?
我ggplot2在两行的图表底部有一个图例.我需要增加项目之间的水平空间.
目前代码是:
p + theme(legend.key = element_blank(),
legend.position = "bottom",
legend.title = element_blank(),
legend.direction = "horizontal") +
guides(linetype = guide_legend(ncol = 3,keywidth=4))
Run Code Online (Sandbox Code Playgroud)
但结果项目太近了:

有什么建议吗?
我想将数据框转换为列表列表,如下例所示:
df <- data.frame(var1=c("A","A","A","B","B","C"),var2=seq(1,6))
> var1 var2
1 A 1
2 A 2
3 A 3
4 B 4
5 B 5
6 C 6
split(df$var2,df$var1)
$A
[1] 1 2 3
$B
[1] 4 5
$C
[1] 6
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否可以使用%>%管道来完成此操作。我不知道如何split在管道中使用,其中df作为输入给出。或者也许还有另一种方法。
我需要使用两个单独的 geom_area 命令生成一个图,以便在零线上方绘制一些时间序列,在零线下方绘制一些时间序列。这是一个简单的例子:
library("reshape2")
library("ggplot2")
d <- as.data.frame(t(read.table(sep=";",header=F,row.names=1,text="
year;1999;2000;2001;2002;2003;2004;2005;2006;2007;2008;2009;2010;2011;2012
primary balance;-5.63;-11.88;-15.37;-18.3;-20.09;-21.45;-21.87;-23.25;-26.98;-29.56;-28.92;-28.46;-29.64;-32.61
snow-ball effect;1.61;0.81;2.67;4.99;7.23;8.02;9.45;9.6;11.01;14.06;22.81;24.41;25.76;26.89
adjustment;2.83;5.38;6.52;3.93;2.28;2.45;3.94;5.28;4.5;6.73;6.94;7.59;7.73;8.07")))
dd <- melt(d,id.vars="year")
dd1 <- subset(dd,variable=="primary balance")
dd2 <- subset(dd,variable!="primary balance")
ggplot()+
geom_area(data=dd1,aes(x=year,y=value,fill=variable,order=variable),alpha=.5)+
geom_area(data=dd2,aes(x=year,y=value,fill=variable,order=variable),alpha=.5)
Run Code Online (Sandbox Code Playgroud)
虽然变量级别的顺序是:(1)“主要平衡”,(2)“雪球效应”和(3)“调整”,但现在我可以告诉 ggplot 分配颜色并将项目放入图例以正确的顺序排列。