gpt4 book ai didi

r - 带对数刻度的条形图

转载 作者:行者123 更新时间:2023-12-01 22:50:23 25 4
gpt4 key购买 nike

我在使用 ggplot 进行缩放时遇到了一个有趣的问题。我有一个数据集,我可以使用默认的线性比例很好地绘制图表,但是当我使用scale_y_log10()时,数字会相差很大。这是一些示例代码和两张图片。请注意,线性比例的最大值约为 700,而对数比例的结果为 10^8。我向您展示整个数据集只有约 8000 个条目长,所以有些事情是不对的。

我想这个问题与我的数据集的结构和分箱有关,因为我无法在“钻石”等常见数据集上复制此错误。但是我不确定排除故障的最佳方法。

谢谢,扎克cp

<小时/>

编辑:bdamarest 可以在钻石数据集上重现比例问题,如下所示:

example_1 = ggplot(diamonds, aes(x=clarity, fill=cut)) + 
geom_bar() + scale_y_log10(); print(example_1)
<小时/>
#data.melt is the name of my dataset    
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar()
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar() + scale_y_log10()
> length(data.melt$name)
[1] 8003

linear scale log scale

这是一些示例数据......我想我看到了问题。原始融化数据集可能有约 10^8 行长。也许行号用于统计?

> head(data.melt)
Library name group
221938 AB Arthrofactin glycopeptide
235087 AB Putisolvin cyclic peptide
235090 AB Putisolvin cyclic peptide
222125 AB Arthrofactin glycopeptide
311468 AB Triostin cyclic depsipeptide
92249 AB CDA lipopeptide
test2 <- data.frame(
Library = rep("AB", 6L),
name = c(
"Arthrofactin", "Putisolvin", "Putisolvin", "Arthrofactin",
"Triostin", "CDA"
),
group = c(
"glycopeptide", "cyclic peptide", "cyclic peptide", "glycopeptide",
"cyclic depsipeptide", "lipopeptide"
),
row.names = c(221938L, 235087L, 235090L, 222125L, 311468L, 92249L)
)
<小时/>

更新:

行号不是问题。以下是使用相同的 aes x 轴和填充颜色绘制的相同数据,并且缩放比例完全正确:

> ggplot(data.melt, aes(name, fill= name)) + geom_bar()
> ggplot(data.melt, aes(name, fill= name)) + geom_bar() + scale_y_log10()
> length(data.melt$name)
[1] 8003

enter image description here enter image description here

最佳答案

geom_barscale_y_log10(或任何对数刻度)不能很好地协同工作,并且不会给出预期的结果。

第一个基本问题是条形变为 0,并且在对数标度上,0 会转换为负无穷大(这很难绘制)。围绕此的婴儿床通常从 1 而不是 0 开始(因为 $\log(1)=0$),如果计数为 0,则不绘制任何内容,并且不用担心失真,因为如果需要对数刻度,您可能不需要不在乎相差 1(不一定正确,但是......)

我正在使用@dbemarest 展示的diamonds 示例。

这样做通常是变换坐标,而不是比例(稍后将详细介绍差异)。

ggplot(diamonds, aes(x=clarity, fill=cut)) +
geom_bar() +
coord_trans(ytrans="log10")

但这会产生错误

Error in if (length(from) == 1 || abs(from[1] - from[2]) < 1e-06) return(mean(to)) : 
missing value where TRUE/FALSE needed

这是由负无穷问题引起的。

当您使用尺度变换时,变换将应用于数据,然后进行统计和排列,然后在逆变换中(粗略地)标记尺度。您可以通过自己进行计算来了解发生了什么。

DF <- ddply(diamonds, .(clarity, cut), summarise, n=length(clarity))
DF$log10n <- log10(DF$n)

这给出了

> head(DF)
clarity cut n log10n
1 I1 Fair 210 2.322219
2 I1 Good 96 1.982271
3 I1 Very Good 84 1.924279
4 I1 Premium 205 2.311754
5 I1 Ideal 146 2.164353
6 SI2 Fair 466 2.668386

如果我们以正常方式绘制它,我们会得到预期的条形图:

ggplot(DF, aes(x=clarity, y=n, fill=cut)) + 
geom_bar(stat="identity")

enter image description here

缩放 y 轴会产生与使用未预先汇总的数据相同的问题。

ggplot(DF, aes(x=clarity, y=n, fill=cut)) +
geom_bar(stat="identity") +
scale_y_log10()

enter image description here

我们可以通过绘制计数的 log10() 值来了解问题是如何发生的。

ggplot(DF, aes(x=clarity, y=log10n, fill=cut)) +
geom_bar(stat="identity")

enter image description here

这看起来就像带有 scale_y_log10 的标签,但标签是 0, 5, 10, ... 而不是 10^0, 10^5, 10^10, ...

因此,使用 scale_y_log10 进行计数,将其转换为对数,堆叠这些对数,然后以反对数形式显示比例。然而,堆叠日志不是线性转换,因此您要求它执行的操作没有任何意义。

最重要的是,对数刻度上的堆叠条形图没有多大意义,因为它们不能从 0 开始(条形底部应该在的位置),并且比较条形的各个部分是不合理的,因为它们的大小取决于它们在堆栈中的位置。考虑类似:

ggplot(diamonds, aes(x=clarity, y=..count.., colour=cut)) + 
geom_point(stat="bin") +
scale_y_log10()

enter image description here

或者,如果您确实想要堆叠条形通常会给您带来的组总数,您可以执行以下操作:

ggplot(diamonds, aes(x=clarity, y=..count..)) + 
geom_point(aes(colour=cut), stat="bin") +
geom_point(stat="bin", colour="black") +
scale_y_log10()

enter image description here

关于r - 带对数刻度的条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9502003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com