使用 ggsave 和其他保存功能绘图时出错

如何解决使用 ggsave 和其他保存功能绘图时出错

我有一个关于函数 ggsave() 的问题,我将非常感谢任何帮助和/或建议/解决方案。我正在创建四个图并将它们全部放在一个大图中,因为我想使用数据框中的所有列循环整个函数,所以我想将创建的图保存在指定的文件夹中(最好带有识别名称)。>

    plotting_fun3 <- function(Q){
  
  plot1 <- plot_likert(
    t(Q),title = "Total population",legend.labels = c("strongly disagree","disagree","neither nor","agree","strongly agree"),grid.range = c(1.6,1.1),expand.grid = FALSE,axis.labels = c(" "),values = "sum.outside",show.prc.sign = TRUE,catcount = 4,cat.neutral = 3,)
  
  plot2 <- plot_likert(
    t(Q[survey$animal=="Dogs"]),title = "Female",)
  
  plot3 <- plot_likert(
    t(Q[survey$animal=="Cats"]),title = "Male",)
  
  plot4 <- plot_likert(
    t(Q[survey$animal=="Turtle"]),title = "Others",)
  
  theplot <- ggarrange(plot1,plot2,plot3,plot4,labels = NULL,common.legend = TRUE,legend = "bottom",ncol = 1,nrow = 4)
  
  #ggsave(filename=paste(Q,".png",sep=""),plot=theplot,device = "png")
  
  #ggsave(filename=paste("animal_plot",ID,".jpeg"),plot=plots[[x]])
  
  #ggsave(path = "/myDirectory",#       device = "png",filename = "animal_plot",plot = theplot)
  
  #save_plot(filename = "hello",plot = theplot,#          "/myDirectory",#          device = "png")

  #ggsave(sprintf("%s.pdf",Q),device = "pdf")
  
  return(theplot)
}

注释行显示了我尝试将绘图保存在我的目录中的各种方式。我遇到了 2 个不同的问题:

要么:我在堆栈溢出时发现的大多数 ggsave 建议。其中一些没有包含行 device = "png"。如果我省略这行代码,我总是会得到这样的结果:

 Fehler: `device` must be NULL,a string or a function.
Run `rlang::last_error()` to see where the error occurred. 

如果我按照那个命令我得到:

<error/rlang_error>
`device` must be NULL,a string or a function.
Backtrace:
 1. global::plotting_fun3(survey[,9])
 2. ggplot2::ggsave(sprintf("%s.pdf",Q))
 3. ggplot2:::plot_dev(device,filename,dpi = dpi)
Run `rlang::last_trace()` to see the full context.
> rlang::last_trace()
<error/rlang_error>
`device` must be NULL,a string or a function.
Backtrace:
    █
 1. └─global::plotting_fun3(survey[,9])
 2.   └─ggplot2::ggsave(sprintf("%s.pdf",Q))
 3.     └─ggplot2:::plot_dev(device,dpi = dpi)

所以我在网上找到了有相同或类似问题的人,建议一直使用 device = "png" 或类似的。

现在,如果我这样做,我会遇到一个不同的问题: 绘图保存在正确的目录中,但名称错误。通常名称是“3.png”或“3.pdf”或取决于我创建的内容。如果“3.png”已经存在,它会给文件另一个编号。

三个月前我在一个旧项目中遇到了这个问题,无法解决,现在又遇到了。

就其价值而言,我使用的是 macOS Mojave 10.14.6,我的 R 版本是 1.3.1093 版

预先感谢您的任何想法、建议或其他意见。

[编辑]

以下是一些示例数据:

 > str(myDF[,c(2,9:10)])
 data.frame':   123 obs. of  3 variables:
 $ animal: chr  "Cats" "Cats" "Turtles" "Cats" ...
 $ q8    : int  3 5 5 3 4 4 2 5 3 5 ...
 $ q9.1  : int  4 5 5 4 3 4 2 4 2 4 ...

所有观察值的值都保持在 1 到 5 之间。它们实际上代表了诸如“非常同意”、“同意”、“既不同意也不反对”等答案。

或者,如果您更喜欢这个而不是另一个:

> myDF[,9:10)]
     animal q8 q9.1
1      Cats  3    4
2      Cats  5    5
3   Turtles  5    5
4      Cats  3    4
5   Turtles  4    3
6   Turtles  4    4
7   Turtles  2    2
8      Cats  5    4
9      Cats  3    2
10  Turtles  5    4
11  Turtles  4    3
12  Turtles  3    3
13     Dogs  3    3
14     Cats  3    3
15     Dogs  1    1
16     Dogs  1    3

解决方法

文件名的问题是由于您使用了 Q,它是文件名定义中的一个数据框,因此它会导致一些非常混乱的方式,这取决于您的系统如何处理文件名。

# This command result in a few long character depend on number of columns in Q.
# 4 columns w+ill result 4 long character and ggsvave will return the error
# Error: `device` must be NULL,a string or a function.
ggsave(filename=paste(Q,".png",sep=""),plot=theplot,device = "png")
  
# Again not sure what ID is here but if it was a dataframe you got
# same error with previous one.
ggsave(filename=paste("animal_plot",ID,".jpeg"),plot=plots[[x]])

# This one it doesn't specific a file name but a directory
# ggsave will return an error:
# Error: Unknown graphics device ''
# If you specify device = "png" - error will be:
# Error in grid.newpage() : could not open file '/home/sinh' 
ggsave(path = "/myDirectory",device = "png",filename = "animal_plot",plot = theplot)

# Why there is a param "/myDirectory" here? and you should specify the extention
# in the file name. So the correct param is:
# filename = "/myDirectory/hello.png"
save_plot(filename = "hello",plot = theplot,"/myDirectory",device = "png")

这里应该可以正常工作,但您需要手动输入文件名:

character_variable <- "my_character_variable_here_"
index_number <- 20
# If you specify sep = "" then just need to use paste0
file_name <- paste0(character_variable,index_number)
ggsave(filename=paste(file_name,plot=plots[[x]],device = "png")

这是我基于你的函数的重写函数。你可以尝试一下并稍微调整一下

# df is your survey data.frame
# q_column_name is the name of questionare column that you want to graph.
# the final output file will use q_column_name as file name.
plotting_fun3 <- function(df,q_column_name){
  
  require(foreach)
  require(dplyr)
  require(tidyr)
  
  graph_data <- df %>% select(one_of("animal",q_column_name))
  
  plot1 <- plot_likert(
    t(graph_data),title = "Total population",legend.labels = c("strongly disagree","disagree","neither nor","agree","strongly agree"),grid.range = c(1.6,1.1),expand.grid = FALSE,axis.labels = c(" "),values = "sum.outside",show.prc.sign = TRUE,catcount = 4,cat.neutral = 3,)
  
  animal_plots <- foreach(current_animal = c("Dog","Cats","Turtle")) %do% {
    plot_likert(
      t(graph_data %>% filter(animal == current_animal)),title = "Female",cat.neutral = 3
    )
  }
  
  theplot <- ggarrange(plot1,animal_plots[[1]],animal_plots[[2]],animal_plots[[3]],labels = NULL,common.legend = TRUE,legend = "bottom",ncol = 1,nrow = 4)
  
  ggsave(filename=paste(q_column_name,device = "png")
  
  return(theplot)
}

这里是如何使用该功能

# Assume that your survey dataframe variable is myDF
my_new_plot <- plotting_fun3(df = myDF,q_column_name = "q8")

[更新] - 增加了解决图形问题的功能。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res