如果你只是想要一個原始緩衝區,嘗試fig.canvas.print_rgb
,fig.canvas.print_raw
等(這兩者之間的區別是,raw
是RGBA,而rgb
是RGB。還有print_png
,print_ps
等)
這將使用fig.dpi
代替savefig
(100 dpi)的默認dpi值。即使比較fig.canvas.print_raw(f)
和fig.savefig(f, format='raw', dpi=fig.dpi)
print_canvas
版本是
邊際更快
速度微不足道,因爲它不會重置軸補丁的顏色等,savefig
默認情況下。
無論如何,大部分時間花在以原始格式保存一個數字的時候只是畫出了這個數字,這是無法避開的。
無論如何,作爲一個毫無意義的,但樂趣例如,請考慮以下幾點:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim/2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
fig.canvas.draw()
如果我們看一下原始的抽獎時間:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim/2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
fig.canvas.draw()
這我的機器需要約25秒。
如果我們代替自卸原始RGBA緩衝區中的cStringIO緩衝區,它實際上是稍快於〜22日秒(這是唯一正確的,因爲我使用的是一個互動的後端,否則這將是等效的!):
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim/2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
ram = cStringIO.StringIO()
fig.canvas.print_raw(ram)
ram.close()
如果我們比較這對使用savefig
,具有同等集DPI:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim/2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
ram = cStringIO.StringIO()
fig.savefig(ram, format='raw', dpi=fig.dpi)
ram.close()
這需要〜23.5秒。基本上,savefig
只是設置了一些默認參數,並且在這種情況下調用print_raw
,所以幾乎沒有什麼區別。
現在,如果我們比較壓縮圖像格式(PNG)RAW圖像格式,我們看到了一個更加顯著差異:
import matplotlib.pyplot as plt
import numpy as np
import cStringIO
fig = plt.figure()
ax = fig.add_subplot(111)
num = 50
max_dim = 10
x = max_dim/2 * np.ones(num)
s, c = 100 * np.random.random(num), np.random.random(num)
scat = ax.scatter(x,x,s,c)
ax.axis([0,max_dim,0,max_dim])
ax.set_autoscale_on(False)
for i in xrange(1000):
xy = np.random.random(2*num).reshape(num,2) - 0.5
offsets = scat.get_offsets() + 0.3 * xy
offsets.clip(0, max_dim, offsets)
scat.set_offsets(offsets)
scat._sizes += 30 * (np.random.random(num) - 0.5)
scat._sizes.clip(1, 300, scat._sizes)
ram = cStringIO.StringIO()
fig.canvas.print_png(ram)
ram.close()
這需要到52秒!顯然,壓縮圖像有很多開銷。
在任何情況下,這可能是一個不必要的複雜例子......我想我只是想避免實際工作...
我對這件事並不十分了解。但是你可以看看下面的幫助:'format ='raw''或'format ='rgba''。它看起來像他們產生相同的輸出。 – 2011-03-22 13:24:06
您是否嘗試過分析代碼以查看savefig大部分時間花在哪裏?您是否嘗試過降低分辨率(dpi參數)或其他圖像類型(如果支持,則爲jpeg,gif,tif)? – Bernhard 2011-03-22 15:14:25
@Bernhard:我該怎麼做? – relima 2011-03-22 16:08:09