- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 R 中重建这个古温度图的基本温度趋势。(Original image 和 data。)
x 轴的刻度间隔从百万年的几十到百万到百万,再到万年的几十,等等,但刻度线是均匀分布的。原始图形在 Excel 中精心布置在五个单独的图形中以实现间距。我试图在 R 中获得相同的 x 轴布局。
我尝试了两种基本方法。第一种方法是使用 par(fig=c(x1,x2,y1,y2))
并排放置五个单独的图形。问题是刻度线之间的间隔不均匀,标签重叠。
#1
par(fig=c(0,0.2,0,0.5), mar=c(3,4,0,0))
plot(paleo1$T ~ paleo1$Years, col='red3', xlim=c(540,60), bty='l',type='l', ylim=c(-6,15), ylab='Temperature Anomaly (°C)')
abline(0,0,col='gray')
#2
par(fig=c(0.185,0.4,0,0.5), mar=c(3,0,0,0), new=TRUE)
plot(paleo2$T ~ paleo2$Year, col='forestgreen', axes=F, type='l', xlim=c(60,5), ylab='', ylim=c(-6,15))
axis(1, xlim=c(60,5))
abline(0,0,col='gray')
#etc.
第二种方法(如果可能,也是我的首选方法)是在单个图表中绘制数据。这会导致刻度线之间的距离不均匀,因为它们遵循它们的“自然”顺序。 (编辑: 添加了示例数据以及指向完整数据集的链接。)。
years <- c(500,400,300,200,100,60,50,40,30,20,10,5,4,3,2,1)
temps <- c(13.66, 8.6, -2.16, 3.94, 8.44, 5.28, 12.98, 8.6, 5, 5.34, 3.66, 2.65, 0.78, 0.25, -1.51, -1.77)
test <- data.frame(years, temps)
names(test) <- c('Year','T')
# The full csv file can be used with this line instead of the above.
# test <- read.csv('https://www.dropbox.com/s/u0dfmlvzk0ztpkv/paleo_test.csv?dl=1')
plot(test$T ~ test$Year, type='l', xaxt='n', xlim=c(520,1), bty='l', ylim=c(-5,15), xlab="", ylab='Temperature Anomaly (°C)')
ticklabels = c(500,400,300,200,100,60,50,40,30,20,10,5,4,3,2,1)
axis(1, at=ticklabels)
将 log='x'
添加到 plot
最接近,但刻度之间的间隔仍然不均匀,实际比例当然不是对数比例。
我的示例只下降到 100 万年,因为我试图首先解决问题,但我的目标是匹配上面的原始数字。我对 ggplot 解决方案持开放态度,尽管我只是短暂地熟悉它。
最佳答案
我要表达不同的看法:不要。根据我的经验,在 ggplot2
中做的事情越难(并且在较小程度上,基础图形),它就越不可能成为一个好主意。这里的问题是,像这样不断地改变比例更有可能让观众误入歧途。
相反,我建议使用对数刻度并手动设置截止值。
首先,这里有一些更长的数据,只是为了涵盖您问题的全部可能规模:
longerTest <-
data.frame(
Year = rep(1:9, times = 6) * rep(10^(3:8), each = 9)
, T = rnorm(6*9))
然后,我选择了一些截止点以将标签放置在绘图中。这些可以根据您的需要进行调整,但至少是合理间隔刻度的起点:
forLabels <-
rep(c(1,2,5), times = 6) * rep(10^(3:8), each = 3)
然后,我手动设置一些东西附加到标签上。因此,您不必在轴的一部分下方说“千年”,只需用“k”标记即可。每个数量级都有一个值。注意名称只是为了帮助保持直截了当:下面我只是使用索引来匹配。因此,如果您跳过前两个,则需要调整下面的索引。
toAppend <-
c("1" = "0"
, "2" = "00"
, "3" = "k"
, "4" = "0k"
, "5" = "00k"
, "6" = "M"
, "7" = "0M"
, "8" = "00M")
然后,我将我的 forLabels
更改为我想要使用的文本版本,方法是获取第一个数字,并与上面的正确后缀连接。
myLabels <-
paste0(
substr(as.character(forLabels), 1, 1)
, toAppend[floor(log10(forLabels))]
)
这给出:
[1] "1k" "2k" "5k" "10k" "20k" "50k" "100k" "200k" "500k" "1M" "2M"
[12] "5M" "10M" "20M" "50M" "100M" "200M" "500M"
您可能会将这些用于基本图形,但让对数刻度来执行您想要的操作有时会很棘手。相反,既然你说你对 ggplot2
解决方案持开放态度,我从 this answer 中获取了这个修改后的对数刻度。获得从大到小的对数标度:
library("scales")
reverselog_trans <- function(base = exp(1)) {
trans <- function(x) -log(x, base)
inv <- function(x) base^(-x)
trans_new(paste0("reverselog-", format(base)), trans, inv,
log_breaks(base = base),
domain = c(1e-100, Inf))
}
然后,只需传入数据,并使用所需的间隔设置比例:
ggplot(longerTest
, aes(x = Year
, y = T)) +
geom_line() +
scale_x_continuous(
breaks = forLabels
, labels = myLabels
, trans=reverselog_trans(10)
)
给予:
它具有一致的比例,但标记更加统一。
如果你想要颜色,你可以使用 cut
来实现:
ggplot(longerTest
, aes(x = Year
, y = T
, col = cut(log10(Year)
, breaks = c(3,6,9)
, labels = c("Thousands", "Millions")
, include.lowest = TRUE)
, group = 1
)) +
geom_line() +
scale_x_continuous(
breaks = forLabels
, labels = myLabels
, trans=reverselog_trans(10)
) +
scale_color_brewer(palette = "Set1"
, name = "How long ago?")
这是一个使用 facet_wrap
来创建不同比例的版本。我在这里使用 6,但您可以设置任何您想要的阈值。
longerTest$Period <-
cut(log10(longerTest$Year)
, breaks = c(3, 4, 5, 6, 7, 8, 9)
, labels = paste(rep(c("", "Ten", "Hundred"), times = 2)
, rep(c("Thousands", "Millions"), each = 3) )
, include.lowest = TRUE)
longerTest$Period <-
factor(longerTest$Period
, levels = rev(levels(longerTest$Period)))
newBreaks <-
rep(c(2,4,6,8, 10), times = 6) * rep(10^(3:8), each = 5)
newLabels <-
paste0(
substr(as.character(newBreaks), 1, 1)
, toAppend[floor(log10(newBreaks))]
)
ggplot(longerTest
, aes(x = Year
, y = T
)) +
geom_line() +
facet_wrap(~Period, scales = "free_x") +
scale_x_reverse(
breaks = newBreaks
, labels = newLabels
)
给出:
关于R图: Uniform distance between ticks for non-uniform numbers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41465898/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我已经检查了问题、源代码和其他示例,但我终究无法理解 Distance d = Distance() 是什么。参数在函数中的意思 template int flann::hierarchicalClu
从 GeoDjango Point Field,我得到以下几点: object1.point = "POINT(-113.4741271000000040 53.4235217000000020)"
这是在与@Nargiza 解决此问题的过程中出现的意外行为:3d distance calculations with GeoDjango . 遵循 Distance 上的 Django 文档函数:
我在 C++ 中实现了 Damerau–Levenshtein 距离,但它没有为输入(pantera,主动脉)提供正确的 o/p,正确的 o/p 是 4,但我的代码给出了 5...... int e
嘿,各位极客们! 我对 Web 3.0 有一个革命性的想法,呵呵。我将创建一个像 jQuery-UI 一样的 SVG-UI-lib。为了使某些功能成为可能,我需要 fork /贡献 d3.js。IE。
我有一个列表,其中包含具有 3D 名称和坐标的点列表。类似这样的列表长度要长得多: group=[[gr1, 5, 8, 9], [gr2, 7, 4, 5], [gr3, 3, 8, 1], [gr
我是 OOP 的新手,我在这个任务中一直遇到这个错误。或许你能帮帮我。 这是类头文件: class Distance : public Magnitude { private: double
Django——地质学 我正在寻找如何定义两点之间的距离。第一个与帖子本身有关,不会因每个帖子而改变。它表示帖子的位置。第二个将与用户的位置相关联。 我想计算发布和用户的距离。 问题:假设我已连接:每
当使用短语运算符( )语法进行全文搜索时,它并没有像我期望的那样“小于或等于”数字。搜索值必须正好位于那么多位置之外。 给出这个例子: select * from (values ('bob i
假设我有两个由纬度和经度表示的位置。 位置1:37.5613 , 126.978地点 2 : 37.5776 , 126.973 如何使用曼哈顿距离计算距离? 编辑:我知道计算曼哈顿距离的公式,如 E
我有两个我知道纬度和经度的点。 我如何计算它们之间的距离(以公里和英里为单位)。公式是什么? 最佳答案 您可以使用 haversine formula来计算这样的距离。 关于distance - 以公
我搜索了 A* 的算法/伪代码,然后对其进行了编码。我使用曼哈顿距离作为 h(n)。 ( f(n) = g(n) + h(n) ) 这就是结果, 当没有墙挡路时总是会发生这种情况,但是当我放置很多墙时
我正在寻找一种数据结构来处理包含 512 个二进制值的数十亿个二进制字符串。 我的目标是向结构发送查询并获得一个结果集,其中包含距离更短的所有数据。 我的第一个想法是使用 kd 树。但是这些树对于高维
无线测量相距几米的两个物体(计算机、智能手机或专用设备)之间的距离的最佳方法是什么,精确到约 10 厘米? 这是否可以通过在 WLAN、蓝牙或 GPS 上小 pig 乞求来实现? 最佳答案 Ekaha
给定一个四元数值,我想在一组四元数中找到它的最近邻居。为此,我显然需要一种方法来比较两个四元数之间的“距离”。这种比较需要什么距离表示以及如何计算? 谢谢 乔什 最佳答案 这是一个老问题,但似乎需要更
我们如何测量分类数据之间的相似度距离? 示例:性别:男、女数值:[0 - 100]、[200 - 300]弦乐:专业人士、初学者等... 提前致谢。 最佳答案 有不同的方法可以做到这一点。最简单的一种
我正在开发一种工具来查找给定纬度和经度的两点之间的距离。当纬度和经度在 中给出时就可以了签名学位格式 .但是当在 中给出纬度和经度时,我找不到计算距离的方法。度分秒格式 (例如:N 11° 14' 5
编辑距离查找一个字符串到另一个字符串所需的插入、删除或替换次数。我还想在这个算法中包含掉期。例如“apple”和“appel”应该给出1的编辑距离。 最佳答案 您定义的编辑距离称为 Damerau-L
我实现了一个 levenshtein trie 来查找与给定单词相似的单词。 我的目标是有一种快速的方法来进行拼写纠正。 但是我发现有一种更快的方法可以做到这一点: 莱文斯坦自动机 我只是有一个问题.
我是一名优秀的程序员,十分优秀!