小编jsl*_*che的帖子

ggplot2 - 在剧情之外注释

我想将样本大小值与绘图上的点相关联.我可以geom_text用来定位点附近的数字,但这很麻烦.将它们沿着图的外边缘排列会更加清晰.

例如,我有:

df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20))

ggplot(df,aes(x=x,y=y,label=n))+geom_point()+geom_text(size=8,hjust=-0.5)
Run Code Online (Sandbox Code Playgroud)

这产生了这个情节: 在此输入图像描述

我更喜欢这样的东西: 在此输入图像描述

我知道我可以创建第二个图并使用grid.arrange(这篇文章),但确定textGrobs与y轴对齐的间距会很繁琐.有更简单的方法吗?谢谢!

annotations r ggplot2

62
推荐指数
3
解决办法
6万
查看次数

合并重复的行

我有一个数据框,其中一列是物种的名称,第二列是丰度值.由于采样程序,一些物种出现不止一次(即,其中有多个物种,其中有物种X).我想巩固这些条目并总结它们的丰富程度.

例如,给定此数据框:

set.seed(6)
df=data.frame(
  x=c("sp1","sp2","sp3","sp3","sp4","sp2","sp3"),
  y=rpois(7,2)); df
Run Code Online (Sandbox Code Playgroud)

产生:

    x y
1 sp1 2
2 sp2 4
3 sp3 1
4 sp3 1
5 sp4 3
6 sp2 5
7 sp3 5
Run Code Online (Sandbox Code Playgroud)

我想改为:

    x y
1 sp1 2    
2 sp2 9     (5+4)
3 sp3 7     (5+1+1)
5 sp4 3
Run Code Online (Sandbox Code Playgroud)

提前感谢您提供的任何帮助!

r

35
推荐指数
5
解决办法
4万
查看次数

ggplot2 - 叠加和闪避的条形图

我正在尝试创建一个条形图,使用ggplot2我在一个变量堆叠并由另一个变量躲避的地方.

这是一个示例数据集:

df=data.frame(
  year=rep(c("2010","2011"),each=4),
  treatment=rep(c("Impact","Control")),
  type=rep(c("Phylum1","Phylum2"),each=2),
  total=sample(1:100,8))
Run Code Online (Sandbox Code Playgroud)

我想创建一个条形图,其中x=treatment,y=total堆叠变量是type,并且躲闪变量是year.当然我可以做其中一个:

ggplot(df,aes(y=total,x=treatment,fill=type))+geom_bar(position="dodge",stat="identity")

ggplot(df,aes(y=total,x=treatment,fill=year))+geom_bar(position="dodge",stat="identity")
Run Code Online (Sandbox Code Playgroud)

但不是两个!感谢任何能提供建议的人.

r ggplot2

30
推荐指数
5
解决办法
2万
查看次数

将图例放在第一个构面图中

我想将我的情节传奇放在情节内,在第一个方面的情节内.

这是一些示例代码:

df=data.frame(
 x=runif(10),
 y=runif(10),
 facet=rep(c("a","b"),5),
 color=rep(c("red","blue"),5))

ggplot(data=df,aes(x=x,y=y,color=color))+
 geom_point()+
 facet_wrap(~facet,ncol=1)
Run Code Online (Sandbox Code Playgroud)

这是结果图:

情节与外面的传说

这里大概是我希望它看起来如何:

里面有传说的情节

感谢您的任何帮助,您可以提供!

position r legend ggplot2

29
推荐指数
2
解决办法
9533
查看次数

在地图上绘制插值数据

我有在美国切萨皮克湾不同地点拍摄的物种丰富度的调查数据,我想以图形方式将数据显示为"热图".

我有一个lat/long坐标和丰富度值的数据框,我将其转换为a SpatialPointsDataFrame并使用autoKrige()automap包中的函数生成插值.

首先,任何人都可以评论我是否正确实现了该autoKrige()功能?

其次,我无法绘制数据并覆盖该地区的地图.或者,我可以指定插值网格来反映Bay的边界(如此处所示)吗?关于我如何做到这一点以及我可能从哪里得到这些信息的任何想法?提供网格autoKrige()看起来很容易.


编辑:感谢Paul的超级有用的帖子!这就是我现在拥有的.无法让ggplot接受插值数据和地图投影:

require(rgdal)
require(automap)
#Generate lat/long coordinates and richness data
set.seed(6)
df=data.frame(
  lat=sample(seq(36.9,39.3,by=0.01),100,rep=T),
  long=sample(seq(-76.5,-76,by=0.01),100,rep=T),
  fd=runif(10,0,10))
initial.df=df

#Convert dataframe into SpatialPointsDataFrame
coordinates(df)=~long+lat

#Project latlong coordinates onto an ellipse
proj4string(df)="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
#+proj = the type of projection (lat/long)
#+ellps and +datum = the irregularity in the ellipse represented by planet earth

#Transform the projection into Euclidean distances
project_df=spTransform(df, CRS("+proj=merc +zone=18s +ellps=WGS84 +datum=WGS84")) #projInfo(type="proj")

#Perform the interpolation using …
Run Code Online (Sandbox Code Playgroud)

maps r ggplot2 automap spatial-interpolation

24
推荐指数
1
解决办法
1万
查看次数

ggplot2偏移散点图

我有两组带误差线的点.我想偏移第二个,所以它显示从第一个集稍微下降,所以它不会模糊原始.

这是一个模拟数据集:

x=runif(4,-2,2)
y=c("A","B","C","D")
upper=x+2
lower=x-2
x_1=runif(4,-1,3)
upper_1=x_1+1
lower_1=x_1-2
Run Code Online (Sandbox Code Playgroud)

这是我用来制作情节的代码:

qplot(x,y)+
  geom_point(size=6)+
  geom_errorbarh(aes(xmax=upper,xmin=lower),size=1)+
  geom_point(aes(x_1,y),size=6,pch=8,vjust=-1,col="grey40")+
  geom_errorbarh(aes(xmax=upper_1,xmin=lower_1),size=1,col="grey40")
Run Code Online (Sandbox Code Playgroud)

这是情节:

散点图

我希望将灰色星号和相关的误差条绘制在黑色圆圈和相关误差条下方的头发上.我会转换数据集,但Y轴是分类变量.

r offset ggplot2

12
推荐指数
2
解决办法
9308
查看次数

ggplot2 - 设置下限大于最低点

由于某种原因ggplot2,即使可以获得的最小值为零,我所适合的函数也会延伸到y轴之外.因此,在尝试将下限限制为零时,我注意到似乎只能设置下限,以便省略数据点(或显然是预测点).这是真的?

例如,可以使用expand_limits缩小,因为它是:

require(ggplot2)
p = ggplot(mtcars, aes(wt, mpg)) + geom_point() 
p + expand_limits(y=0)
Run Code Online (Sandbox Code Playgroud)

但无法放大:

p + expand_limits(y=15)
Run Code Online (Sandbox Code Playgroud)

与美学相同:

p + aes(ymin=0)
p + aes(ymin=15)
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用ylim,coord_cartesian等来设置这两个上限和下限,而在这种情况下,我路过一个列表,ggplot使用lapply基于被绘制在列表哪个对象上和上限的变化.所以我回到单独绘制每个对象,这非常乏味.有任何想法吗?

编辑:哈德利证实这是不可能的,所以@Arun的解决方法必须要做!

graphics r ggplot2

12
推荐指数
1
解决办法
1450
查看次数

ggplot2 - 在x轴上添加日期的水平线到刻面图

我正在尝试ggplot2在x轴上的日期中添加零线到刻面图.问题是我也在添加多边形以表示某些时间跨度,所以我必须将单独data.frames的分开传递给分离geoms,这会产生一些困难.

以下是连续x轴的示例:

ggplot()+
  geom_rect(data=data.frame(from=c(1,3),to=c(2,4)),aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+
  geom_point(data=data.frame(x=c(1,2,3,4,5,6),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+
  facet_grid(type~.)
Run Code Online (Sandbox Code Playgroud)

如果我尝试添加一条水平线,geom_hline我得到一个错误:Error in if (empty(data)) { : missing value where TRUE/FALSE needed我采取的是因为geom_vline需要继承基线中提供的信息ggplot.但是,如上所述,我必须单独提供data.frames以创建点和阴影多边形.

如果x轴是连续的,可以通过使用geom_line和设置值来解决这个问题Inf:

ggplot()+
  geom_line(data=data.frame(x=c(-Inf,Inf),y=0),aes(x=x,y=y),col="grey50",lwd=1)+
  geom_rect(data=data.frame(from=c(1,3),to=c(2,4)),aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+
  geom_point(data=data.frame(x=c(1,2,3,4,5,6),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+
  facet_grid(type~.)
Run Code Online (Sandbox Code Playgroud)

但是如果我将x轴切换到日期,那么我就无法使用水平线geom_hline(出于与上述相同的原因):

dates=c("2001-01-1","2002-01-01","2003-01-01","2004-01-01","2005-01-01","2006-01-01")

ggplot()+
  geom_hline(aes(yintercept=0))+
  geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")),
                            to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))),
            aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+
  geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+
  facet_grid(type~.)
Run Code Online (Sandbox Code Playgroud)

类似地,使用geom_line上述方法会产生错误:Error: Discrete value supplied to continuous scale因为x轴不再是连续的.

我可以指定geom_line日期的端点:

ggplot()+
  geom_line(data=data.frame(x=c(as.Date("2001-01-01"),as.Date("2006-01-01")),y=0),aes(x=x,y=y),col="grey50",lwd=1)+
  geom_rect(data=data.frame(from=c(as.Date("2001-01-1"),as.Date("2003-01-01")),
                            to=c(as.Date("2002-01-1"),as.Date("2004-01-01"))),
            aes(xmin=from,xmax=to,ymin=-Inf,ymax=Inf),fill="red",alpha=0.1)+
  geom_point(data=data.frame(x=as.Date(dates),y=c(6,7,8,9,10,11),type=rep(letters[1:2],each=3)),aes(x=x,y=y))+
  facet_grid(type~.)
Run Code Online (Sandbox Code Playgroud)

但现在这条线并没有延长情节的长度!

如何geom_vline使用可以在x轴和刻面上使用日期的东西来重现类似输出?

r ggplot2

9
推荐指数
1
解决办法
1586
查看次数

按行选择行中的最后一个值

我有一个数据框,其中每一行是不同长度值的向量.我想在每一行中创建一个最后一个真值的向量.

这是一个示例数据框:

df <- read.table(tc <- textConnection("
   var1    var2    var3    var4
     1       2       NA      NA
     4       4       NA      6
     2       NA      3       NA                
     4       4       4       4              
     1       NA      NA      NA"), header = TRUE); close(tc)
Run Code Online (Sandbox Code Playgroud)

因此,我想要的值向量c(2,6,3,4,1).

我只是无法弄清楚如何让R来识别最后一个值.

任何帮助表示赞赏!

r dataframe

8
推荐指数
1
解决办法
5446
查看次数

重新排序图例而不更改绘图上的点顺序

我一直在ggplot2中遇到这个问题,也许有人可以帮助我.

我有一个图,其中图例中变量的顺序与它们在图上的显示方式相反.

例如:

df=data.frame(
 mean=runif(9,2,3),
 Cat1=rep(c("A","B","C"),3),
 Cat2=rep(c("X","Y","Z"),each=3))

dodge=position_dodge(width=1)
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+
 geom_point(aes(shape=Cat2),size=4,position=dodge)+
 scale_color_manual(values=c("red","blue","black"))+
 scale_shape_manual(values=c(16:19))+
 coord_flip()
Run Code Online (Sandbox Code Playgroud)

生产:

例

所以点在图上显示为Cat2 = Z,Y,然后是X(黑色菱形,蓝色三角形,红色圆圈),但在图例中它们显示为Cat2 = X,Y,然后是Z(红色圆圈,蓝色三角形,黑钻石).

如何在不改变绘图上的点的情况下反转图例的顺序?重新排序因子会产生相反的问题(图上的点会反转).

谢谢!

r legend ggplot2

8
推荐指数
2
解决办法
3386
查看次数