Python vs. R в выходной графике Babel в режиме org - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь написать отчет в режиме org. Считайте данные из CSV-файла (один столбец, три строки, плавающие числа), сравните их в гистограмме, вставьте диаграмму в отчет, чтобы ее можно было экспортировать в латекс, а затем в pdf.

Мне трудно понять то, что я делаю в части создания кода Python для создания стержней, потому что R_plot работает нормально, то есть диаграмма встроена в отчет в том же режиме org: export: results: file setting.

Что я делаю не так с кодом Python? Если я запускаю код python в интерактивном режиме, он без проблем создает диаграмму, но по какой-то причине 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 голосов
/ 28 апреля 2018

Я считаю, что ваше значение заголовка для блока кода Python неверно. Существует разница между :results <file name> file и :file <file name>. Согласно документации (отредактировано для наглядности):

:results file

Существует четыре класса: аргументы заголовка результатов. Каждый код src Блок может принимать только один вариант на класс. [...]

Коллекция [...]

  • значение по умолчанию. Функциональный режим. Результатом является значение, возвращаемое последним оператором в блоке кода «src». Такие языки, как Python может требует явного оператора возврата в блоке кода src. использование пример:: значение результата.

Тип [...]

  • file интерпретировать как путь к файлу. Вставляет ссылку на файл. Пример использования:: файл значений результатов.

:file <file name>

Внешний: файл, в котором сохраняются результаты выполнения кода блок. [...] Некоторые языки, такие как «R», «точка», «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
...