2

今日、私はコースのレポートを作成していて、あるフィールドの等高線図を含める必要がありました。私はmatplotlibでこれを行いました(混沌としたヘッダーを無視してください):

import numpy as np
import matplotlib
from matplotlib import rc
rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
## for Palatino and other serif fonts use:
#rc('font',**{'family':'serif','serif':['Palatino']})
rc('text', usetex=True)
from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy.ma as ma
from numpy.random import uniform
from matplotlib.colors import LogNorm
fig = plt.figure()
data = np.genfromtxt('Isocurvas.txt')
matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'
rc('text', usetex=True)
rc('font', family='serif')
x = data[:,0]
y = data[:,1]
z = data[:,2]
# define grid.
xi = np.linspace(0.02,1, 100)
yi = np.linspace(0.02,1.3, 100)
# grid the data.
zi = griddata(x,y,z,xi,yi)
# contour the gridded data.
CS = plt.contour(xi,yi,zi,25,linewidths=0,colors='k')
CS = plt.contourf(xi,yi,zi,25,cmap=plt.cm.jet)
plt.colorbar() # draw colorbar
# plot data points.
plt.scatter(x,y,marker='o',c='b',s=0)
plt.xlim(0.01,1)
plt.ylim(0.01,1.3)
plt.ylabel(r'$t$')
plt.xlabel(r'$x$')
plt.title(r' Contour de $\rho(x,t)$')
plt.savefig("Isocurvas.eps", format="eps")
plt.show()

ここで、「Isocurvas.txt」は3列のファイルであり、実際には触れたくありません(データの削除などは、私には機能しません)。私の問題は、フィギュアのサイズが1.8 Mbで、私には大きすぎるということでした。図自体はレポートの他の部分よりも大きく、PDFを開いたときはあまりスムーズではありませんでした。

だから、私の質問は:

フィギュアの品質を犠牲にすることなく、このサイズを縮小する方法はありますか?私は解決策を探していますが、必ずしもPythonに関連しているとは限りません。

これは.pngの図ですが、パラメーターがわずかに異なります。.pngを使用すると、私があまり好きではないピクセルを見ることができるので、pdfまたはepsが望ましいです。

ありがとうございました。

4

3 に答える 3

7

散布図は、サイズが大きくなる原因です。EPSバックエンドを使用して、私はあなたのデータを使用して図を作成しました。これが私が得たファイルサイズです:

  • あなたの例から直接:1.5Mb
  • 散布図なし:249Kb
  • ラスター散布図の場合:249Kb

あなたの特定の例では、なぜスキャッターが必要なのか(見えない)は不明です。ただし、将来の問題に備えrasterized=Trueて、呼び出しでキーワードを使用しplt.scatterてラスターモードをアクティブにすることができます。あなたの例では、散布図に12625ポイントがあり、ベクトルモードでは少しスペースが必要です。

matplotlibからベクター画像をトリミングするために使用するもう1つのトリックは、次のとおりです。

  1. 図をEPSとして保存
  2. 結果のファイルでepstopdf(TeXディストリビューションで利用可能)を実行します

これにより、通常、matplotlibのデフォルトよりも小さいPDFが提供され、品質は変わりません。たとえば、スキャッターのないEPSファイルを使用すると、73KbのPDFが生成されました。これは非常に合理的と思われます。本当にベクトルスキャッターコマンドが必要な場合は、元の1.5 Mb EPSファイルでepstopdfを実行すると、私のシステムで198Kbのpdfが生成されました。

于 2012-11-08T03:47:38.280 に答える
2

サイズに役立つかどうかはわかりませんが、matplotlib 1.2リリース候補を試してみる場合は、PGFイメージを生成するための新しいバックエンドがあります(ラテックスにシームレスに挿入するように設計されています)。そのためのドキュメントはここにあります:http://matplotlib.org/1.2.0/users/whats_new.html#pgf-tikz-backend

あなたがそれを試してみることに決めて、あなたが質問をするならば、私はおそらく話すのに最適な人ではないので、matplotlib-usersメーリングリストに電子メールを送ることをお勧めします。

HTH、

于 2012-11-07T08:52:24.080 に答える
1

データの散布図を削除してみてください。それらは最終的な図には表示されないように見え(サイズ0にしたため)、epsのスペースを占有している可能性があります。

編集済み:質問を間違って読んだため、答えを完全に変更します。

于 2012-11-07T06:23:58.527 に答える