组织模式babel输出图形中的Python与R.

时间:2018-04-27 02:53:10

标签: python org-mode export-to-pdf org-babel

我正在尝试以org-mode编写报告。 从csv文件中读取数据(单列三行,浮点数),在条形图中进行比较,将图表嵌入报表中,以便将其导出到latex,然后导出为pdf。

我很难理解我在python代码的bar创建中所做的事情,因为R_plot工作正常,意味着图表在相同的org-mode下嵌入到报表中:export:results:file setting。

我在使用python代码做错了什么?如果我在交互模式下运行python代码,它会生成图表没有任何问题,但由于某种原因,当我运行cell-block时,py_comparison.png没有被保存。

#+NAME: R_plot
#+BEGIN_SRC R :exports both :results output graphics :file r_comparison.png
# graph in R
library("ggplot2")
performance <- read.csv("comparison.csv", header=FALSE)$V1
df <- data.frame(resource = c("1node1core", "1node8core", "2node8core"), performance = performance)
p <- ggplot(data = df, aes(x=resource, y=performance)) +
     geom_bar(stat="identity", fill="steelblue") + 
     theme_minimal() +
     ggtitle("Computation time (min) vs. Resource (type)")
p
#+END_SRC

#+NAME: python_plot
#+BEGIN_SRC python :exports both :results output graphics :file py_comparison.png
import matplotlib.pyplot as plt; plt.rcdefaults()
import matplotlib.pyplot as plt
import csv

objects = ['1node1core', '1node8core', '2node8core']
y_pos = list(range(0, len(objects)))

performance = []
with open('comparison.csv', newline='') as csvfile:
  reader = csv.reader(csvfile)
  for row in reader:
    f_row = float(row[0])
    performance.append(f_row)

plt.bar(y_pos, performance, align='center', alpha=0.5)
plt.xticks(y_pos, objects)
plt.ylabel('Time')
plt.title('Resource vs. Time')

plt.show()
#+END_SRC

+ END_SRC

1 个答案:

答案 0 :(得分:2)

我相信你的python代码块的标头值是错误的。 :results <file name> file:file <file name>之间存在差异。根据文件(为清晰起见,已编辑):

:results file

  

有四类:结果标头参数。每个'src'代码   block每个类只能选择一个选项。 [...]

     

收藏 [...]

     
      
  • 值默认值。功能模式。结果是'src'代码块中最后一个语句返回的值。像Python这样的语言可能会   在'src'代码块中需要一个显式的return语句。用法   例如::结果值。
  •   
     

输入 [...]

     
      
  • file解释为文件的路径。插入文件的链接。用法示例::结果值文件。
  •   

:file <file name>

  

外部:保存代码执行结果的文件   块。 [...]某些语言,例如'R','dot','ditaa'和'gnuplot',   自动将源代码包装在其他样板代码中。   这种代码包装有助于重新创建输出,尤其是图形   输出,只执行:文件内容。

在python中,plt.show()(或savefig的结果)是None,图像只是副作用,因此不会插入任何内容。在R中它可以工作,因为上面提到的样板包装

所以在python中你需要保存并返回你的图像而不是显示它。这样的事情应该有效:

#+NAME: python_plot
#+BEGIN_SRC python :results img.png file

import matplotlib.pyplot as plt
plt.plot(range(5))
plt.savefig('img.png')
return 'img.png'

#+END_SRC