【发布时间】:2014-11-20 01:11:18
【问题描述】:
我得到了一个数字列表 (n=9),并希望将它们绘制成一个 3*3 的方形网格,每个网格都填充相应的数字。如何在 R 中执行此操作而不安装其他软件包,例如情节。非常感谢!
【问题讨论】:
-
与基本图形,你需要结合
plot.new()和plot.window()(或plot(...,type="n"),segments()和text()
我得到了一个数字列表 (n=9),并希望将它们绘制成一个 3*3 的方形网格,每个网格都填充相应的数字。如何在 R 中执行此操作而不安装其他软件包,例如情节。非常感谢!
【问题讨论】:
plot.new()和plot.window()(或plot(...,type="n"),segments()和text()
这是一个很好的解决方案,只使用基础 R,并输出到 png。请注意默认的png 设备具有相同的宽度和高度。
png("magic_square.png")
par(mar=c(.5,.5,.5,.5))
plot(x=df$x,y=df$y,pch=as.character(df$val),
asp=1, xlim=c(0.5,3.5),ylim=c(0.5,3.5),xaxt="n",yaxt="n",xlab="",ylab="",
xaxs="i", yaxs="i", axes=F)
abline(v=0.5+(0:3),h=0.5+(0:3))
dev.off()
您可以在plot 调用中使用cex 使数字显得更大。
您可以按如下方式添加圆圈。注意 abline 位置。
symbols(1.5,1.5,circles=1,add=TRUE)
并如注释所示进行注释,设置圆圈的背景并使用points绘制额外的文本注释。
symbols(1.5,1.5,circles=1,bg="white",add=TRUE)
text(x=1.5,y=1.5,labels="17",cex=3)
当然,做好这件事的真正关键是掌握数据结构,以便高效调用plot、symbols 和text。
【讨论】:
xaxs = "i", yaxs = "i", axes = F 来绘制更好的输出。
这是一个ggplot 解决方案,比我预期的要难:
# Setup the data
m <- matrix(c(8,3,4,1,5,9,6,7,2), nrow=3, ncol=3)
df <- expand.grid(x=1:ncol(m),y=1:nrow(m))
df$val <- m[as.matrix(df[c('y','x')])]
library(ggplot2)
library(scales)
ggplot(df, aes(x=x, y=y, label=val)) +
geom_tile(fill='transparent', colour = 'black') +
geom_text(size = 14) +
scale_y_reverse() +
theme_classic() +
theme(axis.text = element_blank(),
panel.grid = element_blank(),
axis.line = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
【讨论】:
coord_fixed(),这看起来会特别好。
这是一个使用plotrix(抱歉,如果你使用包会更容易!)和@nograpes 的df 数据。
library(plotrix)
xt <- xtabs(val ~ ., df[c(2,1,3)])
color2D.matplot(xt, vcex = 3, show.values = 1, axes = FALSE, xlab = "",
ylab = "", cellcolors = rep("white", length(xt)))
如果其他答案发生变化,df 是用
m <- matrix(c(8,3,4,1,5,9,6,7,2), nrow = 3, ncol = 3)
df <- expand.grid(x = 1:ncol(m),y = 1:nrow(m))
df$val <- m[as.matrix(df[c('y', 'x')])]
【讨论】:
color2D.matplot (+1) 的好选择
show.values=1 产生的值是小数点后 1,例如 1.0,并将其设置为 0 显示没有值。但是,show.values 在 0 和 1 之间的任何设置都会显示整数值,如上所示。我怀疑这有点骇人听闻,所以它可能不可靠。