Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用R绘制长尾数据的直方图?_R_Histogram - Fatal编程技术网

如何使用R绘制长尾数据的直方图?

如何使用R绘制长尾数据的直方图?,r,histogram,R,Histogram,我的数据主要集中在一个小范围(1-10)内,但有大量的点(比如说10%)在(10-1000)内。我想为这些数据绘制一个直方图,重点放在(1-10)上,但也会显示(10-1000)数据。类似于直方图的对数刻度 是的,我知道这意味着不是所有的垃圾箱大小都一样 一个简单的hist(x)给出 而hist(x,breaks=c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,3,4,5,7.5,10,15,20,50100200500100010000)) 这些都不是

我的数据主要集中在一个小范围(1-10)内,但有大量的点(比如说10%)在(10-1000)内。我想为这些数据绘制一个直方图,重点放在(1-10)上,但也会显示(10-1000)数据。类似于直方图的对数刻度

是的,我知道这意味着不是所有的垃圾箱大小都一样

一个简单的
hist(x)
给出 而
hist(x,breaks=c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,3,4,5,7.5,10,15,20,50100200500100010000))

这些都不是我想要的

更新 根据这里的答案,我现在制作了一些几乎完全符合我要求的东西(我使用了连续图,而不是条形柱状图):


breaks对数比例直方图使用ggplot比使用基本图形更容易。试试像这样的东西

library(ggplot2)
dfr <- data.frame(x = rlnorm(100, sdlog = 3))
ggplot(dfr, aes(x)) + geom_histogram() + scale_x_log10()

解释为什么在基本情况下需要日志值:

如果在不进行日志转换的情况下打印数据,则大多数数据会聚集到左侧的条形图中

hist(dfr$x)
hist
函数忽略
log
参数(因为它会干扰断点的计算),因此这不起作用

hist(dfr$x, log = "y")
这也不是

par(xlog = TRUE)
hist(dfr$x)
这意味着我们需要在绘制绘图之前对数据进行日志转换

    hist(log10(dfr$x))

不幸的是,这会弄乱坐标轴,这将我们带到上面的解决方法。

使用ggplot2似乎是最简单的选择。如果希望对轴和打断进行更多控制,可以执行以下操作:

编辑:提供新代码

x <- c(rexp(1000,0.5)+0.5,rexp(100,0.5)*100)

breaks<- c(0,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,10000)
major <- c(0.1,1,10,100,1000,10000)


H <- hist(log10(x),plot=F)


plot(H$mids,H$counts,type="n",
      xaxt="n",
      xlab="X",ylab="Counts",
      main="Histogram of X",
      bg="lightgrey"
)
abline(v=log10(breaks),col="lightgrey",lty=2)
abline(v=log10(major),col="lightgrey")
abline(h=pretty(H$counts),col="lightgrey")
plot(H,add=T,freq=T,col="blue")
#Position of ticks
at <- log10(breaks)

#Creation X axis
axis(1,at=at,labels=10^at)

x动态图形也有助于绘制此图。使用Rstudio提供的软件包制作动态范围直方图:

breaks <- c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,4,8)
ggplot(t,aes(x)) + geom_histogram(colour="darkblue", size=1, fill="blue") + scale_x_log10('true size/predicted size', breaks = breaks, labels = breaks)![alt text][3]
library(manipulate)
data_dist <- table(data)
manipulate(barplot(data_dist[x:y]), x = slider(1,length(data_dist)), y = slider(10, length(data_dist)))
库(操作)

data_dist@Marek我的问题是记录x轴(或类似),而不是值(y轴)可能的重复:@Joris Meys与Marek的评论相同:我在寻找一个日志x轴,而不是值(y)的日志。@David:我的解决方案为您提供了一个代表原始值的x轴,但具有对数刻度。我甚至保留了你定义的休息时间。这怎么不是你要的?@大卫:你要的不容易做到。ggplot2在对数比例上绘制直方图时忽略中断。可以设置binwidth,但这是一个值。所以所有的钢筋尺寸都是一样的。如果您不希望发生这种情况,请使用基本绘图。正如Joris提到的,在基本情况下设置
xaxt=“n”
axes=FALSE
更干净,因为您不需要手动创建y轴。我不理解基本图形示例-您是否使用值的日志(
log10(dfr$x)
)?为什么?另外,请参阅更新。您的友好ggplot2解决方案(+1)breaks定义了标记和标签的放置位置,major定义了主要垂直线的放置位置。通过一些额外的代码,您可以在需要的地方添加记号和线条。我想,一个额外的命令axis()和labels=NA可以实现这个目的。
x <- c(rexp(1000,0.5)+0.5,rexp(100,0.5)*100)

breaks<- c(0,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,10000)
major <- c(0.1,1,10,100,1000,10000)


H <- hist(log10(x),plot=F)


plot(H$mids,H$counts,type="n",
      xaxt="n",
      xlab="X",ylab="Counts",
      main="Histogram of X",
      bg="lightgrey"
)
abline(v=log10(breaks),col="lightgrey",lty=2)
abline(v=log10(major),col="lightgrey")
abline(h=pretty(H$counts),col="lightgrey")
plot(H,add=T,freq=T,col="blue")
#Position of ticks
at <- log10(breaks)

#Creation X axis
axis(1,at=at,labels=10^at)
library(manipulate)
data_dist <- table(data)
manipulate(barplot(data_dist[x:y]), x = slider(1,length(data_dist)), y = slider(10, length(data_dist)))