编辑:此问题已被标记为重复,但此处的回复已经过尝试但无效,因为相关案例是折线图,而不是条形图.应用这些方法会生成一个包含5行的图表,每年1行 - 没用.投票标记为重复的任何人是否真的在这个问题提供的样本数据集上尝试这些方法?如果是这样,请发布作为答案.
原始问题:
Excel枢轴图中有一个功能,允许多级分类轴.我正在尝试找到一种方法ggplot(或R中的任何其他绘图包).
请考虑以下数据集:
set.seed(1)
df=data.frame(year=rep(2009:2013,each=4),
quarter=rep(c("Q1","Q2","Q3","Q4"),5),
sales=40:59+rnorm(20,sd=5))
Run Code Online (Sandbox Code Playgroud)
如果将其导入Excel数据透视表,则可以直接创建以下图表:

注意x轴有两个级别,一个用于四分之一,一个用于分组变量year.是否可以使用多级轴ggplot?
注意:有一个带有小平面的黑客会产生类似的东西,但这不是我想要的.
library(ggplot2)
ggplot(df) +
geom_line(aes(x=quarter,y=sales,group=year))+
facet_grid(.~year,scales="free")
Run Code Online (Sandbox Code Playgroud)

我是R的新手,在广泛研究了这个错误之后,我仍然无法找到它的解决方案.这是代码.我检查了我的工作目录,并确保文件在正确的目录中.欣赏它.谢谢
pollutantmean <- function(directory, pollutant = "nitrate", id= 1:332)
{ if(grep("specdata",directory) ==1)
{
directory <- ("./specdata")
}
mean_polldata <- c()
specdatafiles <- as.character(list.files(directory))
specdatapaths <- paste(directory, specdatafiles, sep="")
for(i in id)
{
curr_file <- read.csv(specdatapaths[i], header=T, sep=",")
head(curr_file)
pollutant
remove_na <- curr_file[!is.na(curr_file[, pollutant]), pollutant]
mean_polldata <- c(mean_polldata, remove_na)
}
{
mean_results <- mean(mean_polldata)
return(round(mean_results, 3))
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误如下:
Error in file(file, "rt") : cannot open the connection
file(file, "rt")
read.table(file = file, header = header, sep = sep, quote = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将ggplot中所有geom的默认颜色设置为黑色以外的其他颜色.请注意,这不是关于设置scale_color ...
简单的例子:
# linear model with confidence bands...
set.seed(1)
df <- data.frame(x=1:50, y=5 + 2*(1:50)+rnorm(50,sd=10))
lm <- lm(y~x,df)
se <- summary(lm)$sigma # standard error of fit
Z <- qnorm(0.05/2,lower.tail=F) # 95% confidence bands
df <- cbind(df,predict(lm,se.fit=T)[c("fit","se.fit")])
# plot the result...
library(ggplot2)
ggplot(df, aes(x=x)) +
geom_point(aes(y=y), size=3) +
geom_line(aes(y=fit)) +
geom_line(aes(y=fit+Z*se.fit), linetype=2)+
geom_line(aes(y=fit-Z*se.fit), linetype=2)
Run Code Online (Sandbox Code Playgroud)
现在,假设我想让一切都变红.撇开这样做的可取性,我认为ggplot(df, aes(x=x), colour="red")会这样做.但这个colour=参数似乎被忽略了:一切都还是黑的.我可以添加colour="red"到每个geom_电话,但我试图避免这种情况.
编辑:
使用ggplot(df, aes(x=x, color="red"))不是一个选项,因为它使用默认的ggplot调色板(围绕HSL色环均匀分布)创建色阶.只有一种颜色,恰好是浅红色.此外,这会创建一个必须隐藏的图例.#F8766D
setkey()各州的文件:
setkey()对data.table进行排序并将其标记为已排序.排序列是关键.密钥可以是任何顺序的任何列.列始终按升序排序.该表由参考更改 ...(强调添加)
我总是将其解释为setkey()创建索引,而不是物理地重新排列数据表的行(类似于索引数据库表).但是如果这是真的那么删除密钥(使用setkey(DT,NULL)),应该删除索引并将数据表恢复为原始的未排序顺序.这不是发生的事情:
library(data.table)
DT <- data.table(a=3:1, b=1:3, c=5:7); DT
a b c
1: 3 1 5
2: 2 2 6
3: 1 3 7
setkey(DT,a); DT
a b c
1: 1 3 7
2: 2 2 6
3: 3 1 5
setkey(DT,NULL)
a b c
1: 1 3 7
2: 2 2 6
3: 3 1 5
Run Code Online (Sandbox Code Playgroud)
所以有两个问题:
1:如果行重新排列(排序),那么"按引用更改"的含义是什么意思?
2:究竟setkey(DT,NULL)做了什么?
我试图绘制德国的等值线图,显示各州的贫困率(受这个问题的启发).
问题是,有些州(例如柏林)完全被其他州(勃兰登堡州)所包围,而且我很难让ggplot认出勃兰登堡的"洞".
此示例的数据在此处.
library(rgdal)
library(ggplot2)
library(RColorBrewer)
map <- readOGR(dsn=".", layer="germany3")
pov <- read.csv("gerpoverty.csv")
mrg.df <- data.frame(id=rownames(map@data),ID_1=map@data$ID_1)
mrg.df <- merge(mrg.df,pov, by="ID_1")
map.df <- fortify(map)
map.df <- merge(map.df,mrg.df[,c("id","poverty")], by="id")
ggplot(map.df, aes(x=long, y=lat, group=group)) +
geom_polygon(aes(fill=poverty))+
geom_path(colour="grey50")+
scale_fill_gradientn(colours=brewer.pal(5,"OrRd"))+
labs(x="",y="")+ theme_bw()+
coord_fixed()
Run Code Online (Sandbox Code Playgroud)

请注意柏林和勃兰登堡(东北部)的颜色是如何相同的.他们不应该 - 柏林的贫困率远远低于勃兰登堡州.似乎ggplot正在渲染柏林多边形,然后在其上渲染勃兰登堡多边形,没有洞.
如果我geom_polygon(...)按照这里的建议改变呼叫,我可以修复柏林/勃兰登堡问题,但现在三个最北端的状态都被错误地渲染了.
ggplot(map.df, aes(x=long, y=lat, group=group)) +
geom_polygon(aes(group=poverty, fill=poverty))+
geom_path(colour="grey50")+
scale_fill_gradientn(colours=brewer.pal(5,"OrRd"))+
labs(x="",y="")+ theme_bw()+
coord_fixed()
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么??
我试图在对角线中生成一个带有密度图的散点图矩阵(最好使用ggplot).ggpairsGGally包中的文档说明:
diag是一个列表,可能只包含变量'continuous'和'discrete'.diag列表的每个元素都是一个实现以下选项的字符串:continuous =恰好其中一个('density','bar','blank'); discrete =恰好其中一个('bar','blank').
这表明(??)这应该可以使用diag=list(continuous="density").
但是以下代码:
xx <- mtcars[,c(1,3,4,6)] ## extract mpg, disp, hp, and wt from mtcars
library(GGally)
ggpairs(xx,diag=list(continuous="density"))
Run Code Online (Sandbox Code Playgroud)
给出这个:

我究竟做错了什么?
注意:尝试做同样的事情plotmatrix(xx)给出了这个:

这是因为密度图显然是使用基于完整数据集(xx)的范围在每个对角线面上缩放,而不是基于xx适当面的子集的范围.结果,第二行(disp)看起来很好,因为disp具有最大范围,但是第1行和第4行是嘎吱嘎吱的.
假设我有一个包含6列的数据框,我想将col 1:3设置为col 4:6中的值(这在合并时会出现很多).使用数据框架很容易:
set.seed(1)
df <- data.frame(matrix(sample(1:100,30),ncol=6))
df
# X1 X2 X3 X4 X5 X6
# 1 27 86 19 43 75 29
# 2 37 97 16 88 17 1
# 3 57 62 61 83 51 28
# 4 89 58 34 32 10 81
# 5 20 6 67 63 21 25
df[,1:3] <- df[,4:6] # very, very straightforward...
df
# X1 X2 X3 X4 X5 X6
# 1 43 75 29 43 75 29
# 2 …Run Code Online (Sandbox Code Playgroud) 这个问题是由这个问题引起的.
考虑两个向量,a和b两个数据表dt.a,dt.b如下所示:
a <- c(55, 1:25)
b <- c(55,30:40)
library(data.table)
dt.a <- data.table(x=a,key="x")
dt.b <- data.table(x=b,key="x")
intersect(a,b)
[1] 55
dt.a[dt.b,nomatch=0]
x
1: 55
Run Code Online (Sandbox Code Playgroud)
目标是计算共同元素的数量.
我的问题是:为什么数据表加速比30X慢intersect(...)
system.time(for (i in 1:1000){intersect(a,b)})
user system elapsed
0.05 0.00 0.04
system.time(for (i in 1:1000){dt.a[dt.b,nomatch=0]})
user system elapsed
1.68 0.00 1.69
Run Code Online (Sandbox Code Playgroud) 我试图(部分地)重现在s.class(...)包中ade4使用的群集图ggplot,但这个问题实际上更为通用.
注意:这个问题是指"星形图",但实际上只讨论了蜘蛛图.
df <- mtcars[,c(1,3,4,5,6,7)]
pca <-prcomp(df, scale.=T, retx=T)
scores <-data.frame(pca$x)
library(ade4)
km <- kmeans(df,centers=3)
plot.df <- cbind(scores$PC1, scores$PC2)
s.class(plot.df, factor(km$cluster))
Run Code Online (Sandbox Code Playgroud)

我正在寻找的基本特征是"星星",例如从公共点(这里是聚类质心)辐射到一些其他点(这里是聚类中的点)的一组线.
有没有办法使用该ggplot包?如果没有直接通过ggplot,那么有没有人知道一个有用的加载项.例如,有几个变体stat_ellipse(...)不是ggplot包的一部分(这里和这里).
考虑一下ggplot(...)函数内部的这种用法.
x <- seq(1,10,by=0.1)
df <- data.frame(x,y1=x, y2=cos(2*x)/(1+x))
library(ggplot2)
gg.fun <- function(){
i=2
plot(ggplot(df,aes(x=x,y=df[,i]))+geom_line())
}
if(exists("i")) remove(i)
gg.fun()
# Error in `[.data.frame`(df, , i) : object 'i' not found
i=3
gg.fun() # plots df[,3] vs. x
Run Code Online (Sandbox Code Playgroud)
看起来ggplot似乎无法识别i函数内定义的变量,但确实识别i它是否在全局环境中定义.这是为什么?
请注意,这给出了预期的结果.
gg.new <- function(){
i=2
plot(ggplot(data.frame(x=df$x,y=df[,i]),aes(x,y)) + geom_line())
}
if(exists("i")) remove(i)
gg.new() # plots df[,2] vs. x
i=3
gg.new() # also plots df[,2] vs. x
Run Code Online (Sandbox Code Playgroud)