r - 在 r 中导出时提高图形质量
问题描述
我编写了以下代码来比较一段时间内的不同变量。代码工作正常,但唯一的问题是当我将文件输出为“jpeg”时,线条不平滑,我的箭头也不像我喜欢的那样平滑,换句话说,图形感觉质量非常低。但是当我将它输出为“pdf”时,我会得到平滑的线条,并且图形的质量更高。但是 pdf 文件的文件大小很大,我需要将这些图表插入到 word 文件中。我发现将 jpeg 附加到 word 文件中相对容易。那么在jpeg格式的情况下是否可以提高图像质量。我尝试使用res
参数,jpeg()
但它不会输出图形,因为它显示在 rstudio 中。
我将不胜感激。谢谢!
代码:
library(shape)
library(Hmisc)
### samples ######
xaxs = seq(1,30,length=30)
precip = sample(200:800, 30)
ero = sample(0:10, 30, replace = T)
#########
svpth = getwd()
nm = "try.jpeg"
jpeg(paste0(svpth,"/",nm), width=950 , height =760, quality = 200, pointsize =15)
par(mar= c(5,4,2,4), oma=c(1,1,1,1))
plot(xaxs,precip, type = "p", pch=15, col="green", ylim = c(200,1000),
xlab = "Year" , ylab = "", cex.main=1.5, cex.axis=1.5, cex.lab=1.5)
lines(xaxs, precip,lty =1, col="green")
# xtick<-seq(0,30, by=1)
# axis(side = 1, at=xtick, labels = FALSE )
minor.tick(nx=5, ny=2, tick.ratio=0.5, x.args = list(), y.args = list())
mtext("Depth (mm)", side = 2, line = 2.7, cex = 1.5)
par(new=T)
plot(xaxs, (ero * 10), ylim = c(0,max(pretty(range((ero * 10))))+20), type = "p", pch=20, cex=1.5, col="red", axes = F, xlab = "", ylab = "")
lines(xaxs, (ero * 10),lty =2, col="red")
axis(side = 4, at=pretty(range((ero * 10))), cex.axis = 1.5)
# mtext("Erosion (t/ha/yr)", side = 4, line = 2.2, cex = 1.5)
mtext(expression(paste("Erosion (t ", ha^-1, yr^-1, ")")), side = 4, line = 2.7, cex = 1.5)
legend("topleft", legend = c("Precipitation","Erosion"), lty = c(1,2), pch = c(15,20), col = c("green","red"), cex = 1.6, bty = "n")
####arrow
Arrows(7, 85, 11, 90,lwd= 1.1)
Arrows(26, 85, 21, 90, lwd= 1.1)
txt = "High erosion rates in \nwheat-planting years"
xt = 16
yt = 85
text(xt, yt, labels = txt, family="serif", cex = 1.23)
sw = strwidth(txt)+1.4
sh = strheight(txt) +6
frsz = 0.38
rect(xt - sw/2 - frsz, yt - sh/2 - frsz, xt + sw/2 + frsz, yt + sh/2 + frsz-1)
# legend(15,80, legend = c("High erosion rates in \nwheat-planting years\n"),
# xjust = 0.5, yjust = 0.5)
dev.off()
解决方案
它没有使用base R,但这会生成一个svg,它比jpeg小,并且会创建一些漂亮的图像。MS Word 对 svg 也没有任何问题。svg——18 kb;jpeg - 592 kb 用于同一图像。 如果它有效,则使用,如果无效,那么,也许其他人可以使用它?这不会显示在 RStudio 的绘图窗格中,它将显示在查看器窗格中。在代码之后,我有一张将绘图保存在 RStudio 的查看器窗格中的图像。
library(plotly)
df = data.frame("Year" = xaxs, "Depth" = precip, "Erosion" = ero *10)
p = plot_ly(df) %>%
add_trace(x = ~Year, y = ~Depth,
type = 'scatter', mode = 'lines', # to have both the points and lines use 'lines+markers'
name = "Depth",
line = list(shape = "spline", # smooth the curves in the lines (not that effective with lines+markers)
color = "green")) %>%
add_trace(x = ~Year, y = ~Erosion,
mode = 'lines',
name = "Erosion",
yaxis = "y2", # second y axis
line = list(dash = 'dash', # dash the lines
shape = "spline", # smooth the curves in the lines
color = "red")) %>% # without "lines+markers" spline will smooth out the points of the line
add_annotations(inherit = F, # add the arrows at the top of the plot
x = list(12, 18), # this is plot coordinates
y = list(800, 800),
ax = list(-60, 60), # this is pixels
ay = list(10, 10),
showarrow = T,
text = "") %>%
add_annotations(inherit = F, # add the textbox at the top of the plot
x = 15, y = 800,
ax = 0, ay = 0,
showarrow = F,
bordercolor = 'black',
text = "High erosion rates in\nwheat-planting years") %>%
layout(yaxis2 = list(overlaying = "y", side = "right", # add labels
title = paste0("Erosion (t ",
"ha<sup>-1</sup>",
"yr<sup>-1</sup>",
")")),
yaxis = list(title = "Depth (mm)"),
legend = list(x = .1, y = 1000),
margin = list(r = 80)) # right margin space for label
要保存它,请添加功能。直到您将鼠标悬停在它们上方,最后图像中绘图顶部的图标才会显示。我想你可能会发现,如果你使用它,你所拥有的高度/宽度规格就不再是最合适的了。
(p <- p %>% config( # save the plot; add a save function to the plot
toImageButtonOptions = list(
format = "svg",
filename = "try",
width = 950,
height = 760)) # end config
) # end () for print simo object assignment
剧情。此图像中的宽度和高度为 950 x 550。
推荐阅读
- python - Plotly:如何生成并排的 px.sunburst 图?
- python - 可视化 10 个随机测试示例、预测标签和来自 MNIST 数据集的实际标签
- c# - C# 是否有理由不支持在逻辑评估中进行速记、空条件检查?
- javascript - 节点JS超过不正确
- python - Python Jupiter Notebook 过滤具有来自同一列的值的数据
- azure-active-directory - 我们是否可以在我们的 azure 上创建一个应用程序并可以与他人共享使用?
- c++ - C++ - 我如何将 3 行安全的字符串拆分为“结果”,并为所有 3 个字符串创建一个单行“同义词”。- C++
- java - 下面的递归任务的实现是否正确?
- mysql - 尝试在 Django 中链接表时不兼容的外键?
- docker - 如何与 Kubernetes 集群外部的数据库通信