如何用R / tikz可视化一维数字数据?

时间:2014-08-03 19:44:04

标签: r visualization

我有一个包含166898行的文本文件,其中每行都有一个非负数。我想通过以下方式将其可视化:

  • x轴的范围应为minimum_in_filemaximum_in_file
  • y轴的范围应为1166898
  • 图形/条形图应该增加并可视化有多少数字等于x值或更低。

创建数据

#!/usr/bin/env python

import random

minimum_in_file = 0
maximum_in_file = 378864471
numbers = []
for i in range(166898):
    numbers.append(random.randint(minimum_in_file, maximum_in_file))

numbers = sorted(numbers)

with open("times-sorted.txt", 'a') as f:
    for number in numbers:
        f.write(str(number) + "\n")

真实数据

当我执行dput(head(mydata,20))时,我得到:

structure(list(X0 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = "X0", row.names = c(NA, 
20L), class = "data.frame")

> dput(head(mydata,1000))
structure(list(X0 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 2L, 3L, 3L, 5L, 6L, 7L, 8L, 8L, 
8L, 8L, 11L, 12L, 13L, 13L, 13L, 16L, 18L, 19L, 20L, 20L, 23L, 
25L, 26L, 27L, 35L, 37L, 37L, 39L, 41L, 41L, 45L, 46L, 47L, 48L, 
48L, 48L, 50L, 52L, 53L, 55L, 56L, 62L, 65L, 66L, 67L, 67L, 70L, 
79L, 79L, 80L, 83L, 85L, 86L, 88L, 88L, 89L, 91L, 96L, 97L, 99L, 
100L, 101L, 101L, 101L, 102L, 103L, 104L, 104L, 107L, 109L, 109L, 
109L, 109L, 111L, 111L, 111L, 111L, 112L, 112L, 112L, 112L, 113L, 
113L, 114L, 114L, 114L, 115L, 115L, 115L, 116L, 117L, 118L, 119L, 
120L, 120L, 124L, 124L, 124L, 124L, 125L, 125L, 127L, 127L, 128L, 
128L, 128L, 129L, 129L, 129L, 130L, 130L, 131L, 132L, 132L, 132L, 
133L, 133L, 134L, 134L, 134L, 134L, 136L, 136L, 137L, 137L, 138L, 
139L, 140L, 141L, 141L, 142L, 143L, 143L, 143L, 144L, 144L, 144L, 
145L, 145L, 146L, 147L, 147L, 149L, 149L, 150L, 150L, 150L, 150L, 
150L, 151L, 151L, 151L, 151L, 151L, 152L, 152L, 153L, 154L, 154L, 
154L, 154L, 155L, 156L, 157L, 157L, 158L, 158L, 158L, 158L, 159L, 
160L, 160L, 160L, 160L, 161L, 161L, 163L, 163L, 163L, 164L, 164L, 
164L, 164L, 164L, 165L, 165L, 166L, 166L, 167L, 167L, 167L, 167L, 
168L, 168L, 168L, 169L, 169L, 170L, 170L, 171L, 171L, 172L, 172L, 
172L, 172L, 173L, 173L, 173L, 174L, 174L, 175L, 175L, 175L, 176L, 
176L, 176L, 176L, 177L, 177L, 177L, 177L, 177L, 179L, 179L, 179L, 
180L, 180L, 180L, 180L, 181L, 181L, 182L, 182L, 182L, 182L, 183L, 
183L, 184L, 184L, 184L, 184L, 185L, 185L, 185L, 186L, 187L, 187L, 
187L, 187L, 188L, 188L, 188L, 188L, 189L, 189L, 189L, 189L, 190L, 
190L, 190L, 190L, 191L, 191L, 191L, 191L, 191L, 191L, 191L, 191L, 
191L, 192L, 192L, 193L, 193L, 194L, 194L, 195L, 195L, 195L, 197L, 
197L, 197L, 197L, 197L, 198L, 198L, 198L, 198L, 198L, 198L, 199L, 
199L, 199L, 199L, 199L, 199L, 199L, 200L, 200L, 200L, 200L, 200L, 
200L, 200L, 200L, 200L, 201L, 201L, 203L, 203L, 203L, 204L, 204L, 
204L, 205L, 205L, 206L, 206L, 206L, 206L, 206L, 206L, 206L, 207L, 
207L, 207L, 207L, 207L, 207L, 208L, 208L, 209L, 209L, 209L, 209L, 
209L, 209L, 210L, 210L, 210L, 210L, 210L, 211L, 211L, 212L, 213L, 
213L, 213L, 213L, 215L, 215L, 215L, 215L, 215L, 215L, 215L, 215L, 
215L)), .Names = "X0", row.names = c(NA, 1000L), class = "data.frame")

我尝试了什么

我使用unix工具sort对数据进行了排序,并使用R version 3.0.1 (2013-05-16)尝试了以下内容:

> mydata = read.csv("times-sorted.txt")
> accumulated_sum<-cumsum(mydata)
Warning message:
In lapply(X = x, FUN = .Generic, ...) :
  integer overflow in 'cumsum'; use 'cumsum(as.numeric(.))'
> plot(accumulated_sum)

但我不明白如何修复警告,结果很糟糕:

enter image description here

如何以一种很好的方式将其可视化?

1 个答案:

答案 0 :(得分:1)

请在此处查看此源代码(https://svn.r-project.org/R/trunk/src/main/cum.c)和声明  if(sum > INT_MAX || sum < 1 + INT_MIN) INT_MAX .Machine$integer.max cumsum,可能会超出此限制,因为您将cumsum应用于整个数据集,而不是感兴趣的变量。

由于您尚未发布数据集结构,我认为行索引正在传递给N=166898 vec=1:N #produces warning "Warning message: integer overflow in 'cumsum'; use 'cumsum(as.numeric(.))'" cumsum(vec) 因此警告,

#For reproducibility
set.seed(100)
N=166898
vec=1:N

#Assuming min_val, max_val
min_val = 0
max_val = 378864471

min_break = 1e8
max_break = 4e8
seq_by = 1e8

#Create random values dataset
random_values = sample(min_val:max_val,N,replace = T)
DF=data.frame(vec,random_values)

#Compute Cumulative Frequency
#You can control the buckets by appropriate inputs to breaks
breaks = seq(min_break, max_break, by=seq_by)

#Creates buckets [x,y), [y,z) etc.
DF.cut = cut( DF$random_values, breaks, right=FALSE) 

#Computes count of observations in various buckets and cumulative frequency
DF.freq=table(DF.cut)
DF.cumfreq = c(0, cumsum(DF.freq))

#Plot Data
plot(breaks, DF.cumfreq,main="Cumulative Frequency of XYZ",xlab="Range of Values",ylab="# of Observations < X")
lines(breaks, DF.cumfreq)

您需要累积频率图。以下是改编自的示例示例     (http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph

示例

#Replace the appropriate filename here
mydata = read.table("times-sorted.txt")

min_val_new = min(mydata)
max_val_new = max(mydata)


breaks_new = seq(from=min_val_new,to=max_val_new,length.out=5)

#Creates buckets [x,y), [y,z) etc.
DF.cut_new = cut(mydata[,1], breaks_new, right=FALSE) 

#Computes count of observations in various buckets and cumulative frequency
DF.freq_new=table(DF.cut_new)
DF.cumfreq_new = c(0, cumsum(DF.freq_new))

#Plot Data
plot(breaks_new, DF.cumfreq_new,main="Cumulative Frequency of ABC",xlab="Range of Values",ylab="# of Observations < X")
lines(breaks_new, DF.cumfreq_new)

enter image description here

您的数据

我使用您提供的数据样本绘制了下面的图,但以下内容现在适用于您的文件。

ggplot2

enter image description here

指数图

定义断点cutoff1 = 10000和cutoff2 = 60000并将它们包含在“休息”计算中并使用set.seed(100) require(ggplot2) N=166898 vec=1:N #Assuming min_val, max_val min_val = 0 max_val = 378864471 min_break=0 max_break=4e8 #Create random values dataset random_values = sample(min_val:max_val,N,replace = T) DF=data.frame(vec,random_values) #Define your data breakpoints cutoff1=10000 cutoff2=60000 #Compute Cumulative Frequency #You can control the buckets by appropriate inputs to breaks breaks = c(min_break,cutoff1,seq(cutoff2, max_break, length.out=30)) #Creates buckets [x,y), [y,z) etc. DF.cut = cut( DF$random_values, breaks, right=FALSE) #Computes count of observations in various buckets and cumulative frequency DF.freq=table(DF.cut) DF.cumfreq = c(0, cumsum(DF.freq)) #Plot Data #plot(breaks, DF.cumfreq,main="Cumulative Frequency of XYZ",xlab="Range of Values",ylab="# of Observations < X") #lines(breaks, DF.cumfreq) gg.df=data.frame(breaks,DF.cumfreq) ggplot(gg.df, aes(x = breaks,y=DF.cumfreq)) + geom_line() + scale_x_log10() + xlab("Range of Values: Log Axis") + ylab("# of Observations < X") + ggtitle("Cumulative Frequency of Variable") 和日志轴进行绘图

{{1}}

enter image description here