【问题标题】:How to plot a histogram with hexadecimal values using R?如何使用 R 绘制具有十六进制值的直方图?
【发布时间】:2020-12-11 08:33:03
【问题描述】:

对于我的学士论文,我想使用带有直方图的 R 以十六进制格式(48 位)显示内存地址。

十六进制值存储在 csv 文件中:

$ cat addresses.csv | head -n 4
local variable,static variable,dynamically allocated variable,base (main),printf (library)
0x7ffcfa7c8694,0x55c109737010,0x55c10a70fe80,0x55c1095348fa,0x7f7099a39f00
0x7ffc17929914,0x5572286a9010,0x5572287fde80,0x5572284a68fa,0x7f8308f18f00
0x7ffdd75d11a4,0x55f6a7eff010,0x55f6a8e6de80,0x55f6a7cfc8fa,0x7fbc7d08bf00

所以我将地址绘制如下:

> data = read.csv("addresses.csv")
> str(data)
'data.frame':   203540 obs. of  5 variables:
 $ local.variable                : num  1.41e+14 1.41e+14 1.41e+14 1.41e+14 1.41e+14 ...
 $ static.variable               : num  9.43e+13 9.39e+13 9.45e+13 9.41e+13 9.39e+13 ...
 ...
> hist(local.variable)

结果:

您可能已经注意到,十六进制值被隐式转换为十进制。那不是我想要的。

如何用十六进制值绘制直方图?

我之前的做法:

> data = read.csv("addresses.csv", colClasses = "character")
> str (data)
 'data.frame':  203540 obs. of  5 variables:
 $ local.variable                : chr  "0x7ffcfa7c8694" "0x7ffc17929914" "0x7ffdd75d11a4" "0x7ffee91b85e4" ...
 $ static.variable               : chr  "0x55c109737010" "0x5572286a9010" "0x55f6a7eff010" "0x5592c9774010" ...
 ...
> hist(local.variable)
Error in hist.default(data$local.variable) : 'x' must be numeric

我期待您的想法和复杂的解决方法。谢谢。

编辑:按照要求的可重现格式的样本数据:

> data = read.csv("sample.csv")
> dput(data)
structure(list(local.variable = c(140724510951060, 140720703969556, 
140728216654244), static.variable = c(94287575609360, 93948792705040, 
94517867835408), dynamically.allocated.variable = c(94287592226432, 
93948794101376, 94517884018304), base..main. = c(94287573502202, 
93948790597882, 94517865728250), printf..library. = c(140121590701824, 
140200767491840, 140447528304384)), .Names = c("local.variable", 
"static.variable", "dynamically.allocated.variable", "base..main.", 
"printf..library."), class = "data.frame", row.names = c(NA, 
-3L))

> data = read.csv("sample.csv", colClasses = "character")
> dput(data)
structure(list(local.variable = c("0x7ffcfa7c8694", "0x7ffc17929914", 
"0x7ffdd75d11a4"), static.variable = c("0x55c109737010", "0x5572286a9010", 
"0x55f6a7eff010"), dynamically.allocated.variable = c("0x55c10a70fe80", 
"0x5572287fde80", "0x55f6a8e6de80"), base..main. = c("0x55c1095348fa", 
"0x5572284a68fa", "0x55f6a7cfc8fa"), printf..library. = c("0x7f7099a39f00", 
"0x7f8308f18f00", "0x7fbc7d08bf00")), .Names = c("local.variable", 
"static.variable", "dynamically.allocated.variable", "base..main.", 
"printf..library."), class = "data.frame", row.names = c(NA, 
-3L))

【问题讨论】:

  • 您是否可以接受精度损失?如果您以数字形式读取值,它们将被转换为浮点数。如果没有,您将需要以字符形式读取数据并以其他方式解析它。在这种情况下,dput() 的字符值会更好。
  • 随机样本表明隐式转换的数据类型 numeric (double) 的当前精度是足够的。它可能是 52 位,我有 48 位。因此,将值解析为数字并使用十六进制标签绘制它们就足够了。

标签: r plot histogram


【解决方案1】:

您可以获取 R 用于绘图的以 10 为底的中断,然后在这些位置绘制十六进制标签。例如:

# Fake data
set.seed(2)
x=as.hexmode(sample(1:1e9, 10000))

p = hist(x, xaxt="n")

现在,如果您在控制台中输入p,您会看到它是一个包含多个元素的列表。其中之一称为breaks,它包含直方图的中断值向量。我们可以使用它来创建十六进制标签并将它们添加到绘图中。

labs = as.hexmode(p$breaks)
axis(side=1, at=p$breaks, labels=labs)

以 10 为基数的中断通常不是以 16 为基数的整数。如果要将中断设置为以 16 为基数的整数,可以执行以下操作:

# Generate nice breaks in hexadecimal
brks = seq(as.hexmode(0), as.hexmode(round(1.01*max(x))), by=as.hexmode("4000000"))

p = hist(x, xaxt="n", breaks=brks)

axis(side=1, at=brks, labels=as.hexmode(brks))

【讨论】:

  • as.hexmode() 不幸的是只转换 32 位而不是必要的 48 位,所以这个变体是没有问题的。不过还是感谢您的详细建议,从中我可以学到很多东西,尤其是轴功能似乎在这件事上非常有用。
猜你喜欢
  • 2023-03-30
  • 2012-05-01
  • 2020-02-12
  • 2013-01-26
  • 2018-07-26
  • 1970-01-01
  • 2012-08-20
  • 2013-07-13
  • 2017-03-11
相关资源
最近更新 更多