我正在进行定量图像分析,并使用ggplot2可视化结果。输出包含原始图像中每个像素的一个数据点。
geom_raster()
很好地可视化我在R中的数据。但是输出对应于结果的光栅图像会很不错。这样,我可以使用轻量级图像查看器(例如feh
)翻阅几个派生图像,像素将完美排列。
是否有一种简单的方法可以将像素和仅像素输出到图像文件?没有传说,没有轴,只有像素。假设我的data.frame
包含row
和col
的列,并且所需的输出分辨率也是已知的。
答案 0 :(得分:3)
以这种方式:
library(ggplot2)
library(reshape2) # for melt(...)
n <- 100
set.seed(1) # for reproducible example
img <- matrix(rnorm(n^2,30,3),nc=n)
gg <- melt(data.frame(x=1:n,img),id="x")
ggplot(gg) + geom_raster(aes(x=x,y=variable,fill=value))+
scale_x_continuous(expand=c(0,0))+ # get rid of extra space on x-axis
guides(fill=FALSE)+ # turn off color legend
theme(axis.text=element_blank(), # turn off the axis annotations
axis.ticks=element_blank(),
axis.title=element_blank())
答案 1 :(得分:1)
感谢jlhoward指出我正确的方向。还有一些缺失的成分 - 例如,没有labs(x=NULL, y=NULL)
,输出PNG将在底部和左侧有白色边框。
我认为我的解决方案应该包含两个部分:
这是一个这样的功能。
BorderlessPlotPng <- function(plot, ...) {
# Write a ggplot2 plot to an image file with no borders.
#
# Args:
# plot: A ggplot2 plot object.
# ...: Arguments passed to the png() function.
require(grid)
png(type='cairo', antialias=NULL, units='px', ...)
print(plot
+ theme(plot.margin=unit(c(0, 0, -0.5, -0.5), 'line'),
axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
legend.position='none')
+ scale_x_continuous(expand=c(0, 0))
+ scale_y_continuous(expand=c(0, 0))
+ labs(x=NULL, y=NULL)
)
dev.off()
}
为了看到它的实际效果,这里是一些合成数据的图表。 (为了演示目的,我将每个输出像素设置为10像素宽。)
# Synthetic data.
width <- 64
height <- 48
d <- data.frame(row=rep(1:height, each=width),
col=rep(1:width, height),
x=rnorm(n=width * height))
# Construct and print the plot.
library(ggplot2)
plot <- (ggplot(data=d, aes(x=col, y=height + 1 - row, fill=x))
+ geom_raster()
+ scale_fill_gradient2()
)
pixel_size <- 10
BorderlessPlotPng(plot,
filename='test.png',
width=width * pixel_size,
height=height * pixel_size)
输出:
当然,使用pixel_size <- 1
运行会为您提供1:1的图像,您可以通过前后翻转将其与原始图像进行比较。