【问题标题】:Plot sparse data with hexadecimal labels using ggplot2使用 ggplot2 绘制带有十六进制标签的稀疏数据
【发布时间】:2016-07-27 10:42:23
【问题描述】:

我想使用 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 变体。

非常感谢任何帮助!

【问题讨论】:

    标签: r ggplot2 hex sparse-matrix labels


    【解决方案1】:

    我找到了这个例子的有效代码:

    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)
    

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2013-06-10
      • 2014-02-18
      • 1970-01-01
      • 2017-05-07
      • 2015-01-21
      • 2011-12-09
      • 1970-01-01
      • 2019-02-16
      相关资源
      最近更新 更多