2013-04-04 2 views
5

Я создаю фиксированный контурный график с функцией matplotlib.pyplot.contourf(). Аргументы в вызове функции являются:Псевдонимы при сохранении контура контура matplotlib в .pdf или .eps

contourf(xvec,xvec,w,levels,cmap=matplotlib.cm.jet) 

где

xvec = numpy.linspace(-3.,3.,50) 
levels = numpy.linspace(-0.01,0.25,100) 

и ж мои данные.

Получившийся участок выглядит довольно неплохо на экране, но когда я сохраняю его в pdf, используя вызов matplotlib.pyplot.savefig(), в результате получится много псевдонимов (я думаю, что это такое) , Вызов savefig - это просто savefig('filename.pdf'). Я пробовал использовать аргумент dpi, но не повезло. Звонок matplotlib.get_backend() выплевывает «TkAgg».

Я приложу рисунок, сохраненный в формате PDF, по сравнению с фигурой, сохраненный в формате PNG (подобно тому, как он выглядит на экране), чтобы продемонстрировать проблему:

PNG wihtout ступенчатости: https://dl.dropbox.com/u/6042643/wigner_g0.17.png

PDF с наложение изображений: https://dl.dropbox.com/u/6042643/wigner_g0.17.pdf

Пожалуйста, дайте мне знать, если есть какие-либо другие подробности, которые я мог бы дать, чтобы помочь вам дать ответ. Я должен упомянуть, что сохранение в виде .eps дает такие же плохие результаты, как и сохранение в pdf. Но в PDF-документе эта проблема еще более ясна. Моя цель состоит в том, чтобы в конечном итоге обеспечить качество продукции .eps, которые я могу приложить к латексному документу, который будет опубликован как научная статья. Я был бы доволен какой-то работой, где я сохраняю в одном формате, а затем конвертирую ее, если найду способ, который даст удовлетворительные результаты.

Бест,

Arne

+0

Те похожи [Муаровые] (https://en.wikipedia.org/wiki/Moir%C3%A9_pattern) мне. С помощью pdf шаблон изменяется в зависимости от уровня масштабирования. – tacaswell

+2

@arne: Связанные файлы исчезли - есть шанс заменить их? –

ответ

5

После использования полезного ответа от @pelson какое-то время я нашел подходящее решение этой давней проблемы (в настоящее время в Matplotlib 2.0), которая не требует нескольких вызовов для контура или растеризации рисунка.

Я ссылаюсь на свой первоначальный ответ here для более подробного объяснения и примеров.

В целом, решение состоит из следующих строк:

cnt = plt.contourf(x, y, z) 

for c in cnt.collections: 
    c.set_edgecolor("face") 

plt.savefig('test.pdf') 
6

Я понятия не имел, что контурная в формате PDF было так плохо. Вы правы, я думаю, что контуры сглаживаются визуализаторами PDF за пределами matplotlib. Именно по этой причине я считаю, что вам нужно быть особенно осторожным, какое приложение вы используете для просмотра полученного PDF-файла - лучшее поведение, которое я видел, с GIMP, но я уверен, что есть много других зрителей, которые хорошо работают.

Чтобы устранить эту проблему (при просмотре PDF с GIMP), я был в состоянии «растеризации» контуры, полученные с Matplotlib, чтобы избежать уродливую белую проблему линии:

import matplotlib.pyplot as plt 
import numpy as np 


xs, ys = np.mgrid[0:30, 0:40] 
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2 

cs = plt.contourf(xs, ys, data, 60, cmap='jet') 

# Rasterize the contour collections 
for c in cs.collections: 
    c.set_rasterized(True) 

plt.savefig('test.pdf') 

Это произвело контур участка, который не показали проблем, которые вы показали.

Другой альтернативой, возможно, лучше всего подходит, чтобы обмануть антиалиасинг, поместив цветные линии под контур.

import matplotlib.pyplot as plt 
import numpy as np 


xs, ys = np.mgrid[0:30, 0:40] 
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2 

# contour the plot first to remove any AA artifacts 
plt.contour(xs, ys, data, 60, cmap='jet', lw=0.1) 
cs = plt.contourf(xs, ys, data, 60, cmap='jet') 

plt.savefig('test.pdf') 

Я должен отметить, что я не вижу эти проблемы, если я сохранить фигуру как «.ps», а не «.pdf» - возможно, это третий вариант.

Надеюсь, что это поможет вам получить бумагу, выглядящую именно так, как вы хотите.

+1

Привет, пелсон. Я пошел на второе решение, и он работал очень хорошо. Большое спасибо. – arne

+0

Я также могу подтвердить это поведение, если я сохраню 'contourf()' с уровнями, в PS, EPS, PDF, но не в SVG-выходе. Кроме того, этот вид PS/EPS/PDF через GhostScript и вывод, например, PNG с разрешением 300 точек на дюйм, не вызывает проблем, но просмотр PDF в Acrobat, SumatraPDF (использует движок mupdf, выведенный теми же людьми за GhostScript), CorelDraw, Ipe, .. все это показывает, что это артефакт. – theta

+0

Более того, это не то, что контуры имеют контуры, но есть крошечный зазор между контурами и белый фон окна сюжета - это то, что показано как контурный контур. – theta

Смежные вопросы