我想在GNU R中使用ggplot2使用稀疏比例和漂亮的十六进制标签来绘制稀疏数据。 我有一个类似于以下的数据框和标签功能:
require(ggplot2)
df <- data.frame(src = round(c(0x10000:0x10100,runif(100, 0x1000,0x100000))),
dst = round(c(0x11000:0x11100,runif(100,0x1000,0x100000))))
hexlabels=function(x) {base::sprintf("0x%x",as.integer(x))}
关键是数据在很大范围内非常稀疏地扩散。 此外,还有一些密集区域和稀疏区域。
基本点图ggplot(df, aes(x = src, y = dst)) + geom_point() + scale_x_continuous(labels = hexlabels) + scale_y_continuous(labels = hexlabels)
不能以恰当的方式表示图的密集部分,并且十六进制标签位于不幸的断点处。
为了解决第一个问题,我因此试图使用离散尺度转换为因子:
ggplot(df, aes(x = factor(src), y = factor(dst))) +
geom_point() +
scale_x_discrete(labels = hexlabels) +
scale_y_discrete(labels = hexlabels)
此结果是一个图表,显示了点的充分表示,但完全不可读的离散比例。
到目前为止,我已使用索引返回连续比例以获得可读结果,但没有有意义的标签。
ggplot(df, aes(x = as.numeric(factor(src)),
y = as.numeric(factor(dst)))) + geom_point()
你能否给我提示如何用类似的比例来实现这个图,但是使用原始的src
和dst
值作为轴上的标签,可能有十六进制值的漂亮中断?
到目前为止,我未能成功将src
和dst
数据转换为单独的预处理数据框(参考资料):
require(scales)
as.referencelike <- function(x) {
data.frame(ref = x, idx = as.numeric(as.factor(x))) }
df$rlsrc = as.referencelike(df$src)
df$rldst = as.referencelike(df$dst)
referencelike_trans <- trans_new("referencelike",
transform = function(x) {x$idx},
inverse = identity)
ggplot(df, aes(x = rlsrc, y = rldst)) + geom_point() +
scale_x_continuous(trans = referencelike_trans) +
scale_y_continuous(trans = referencelike_trans)
这导致错误Error: Aesthetics must be either length 1 or the same as the data (357): x, y
,可能是因为ggplot占用了小数据帧的长度,并且没有检查转换。
此外,仍然需要实现逆变换。
实际上似乎没有调用指定的转换。
我的第二次尝试是创建一个自定义类:
require(scales)
reference <- setClass("reference", slots = c("ref","idx"))
as.reference <- function(y) {
i = as.numeric(as.factor(y))
Map(function(a,b) {
reference(ref = a, idx = b) }, y, i)}
df$rsrc = as.reference(df$src)
df$rdst = as.reference(df$dst)
reference_trans <- trans_new("reference",
transform = function(x) {x@idx},
inverse = identity)
as.data.frame.reference <- function(x,...) { data.frame(ref = x@ref, idx = x@idx, ...) }
ggplot(df, aes(x = rsrc, y = rdst)) + geom_point() +
scale_x_continuous(trans = reference_trans) +
scale_y_continuous(trans = reference_trans)
此时我收到以下错误:Error: geom_point requires the following missing aesthetics: x, y
到目前为止,我还没有尝试为十六进制数据实现pretty_breaks
变体。
非常感谢任何帮助!
答案 0 :(得分:0)
我找到了这个例子的工作代码:
hexbreaks <- function(x) {
n = 5
x<-as.numeric(x);
mask =0
for(i in seq(30,0)) {
mask = bitwOr(mask,2**i)
masked = bitwAnd(x,mask)
count = sum(masked==x)
if(count >=n) {
return(masked[masked==x])
}
}
c(min(x),median(x),max(x))
}
ggplot(df, aes(x = factor(src), y = factor(dst))) + geom_point() +
scale_x_discrete(breaks=hexbreaks, labels=hexlabels) +
scale_y_discrete(breaks=hexbreaks, labels=hexlabels)