2013-05-31 40 views
7

Tôi đang cố gắng sử dụng matplotlib để vẽ bản đồ nhiệt 3D với kết quả mô phỏng của tôi. Tôi đã đọc this topic và cố gắng sử dụng imshow. Thật không may, khi tôi lưu hình trong SVG hoặc EPS định dạng, nó chuyển đổi heatmat để hình ảnh (mà không phải là chấp nhận được cho tạp chí). Vì vậy, tôi cũng đã thử hexbin - nhưng hình ảnh rất lạ. Tôi không chắc nó sẽ được tạp chí chấp nhận. Chúng tôi có cái gì khác, hoặc tôi phải điền vào heatmat bằng hình chữ nhật?bản đồ nhiệt trong matplotlib với định dạng vector

Ví dụ, nếu một người chạy mã này:

import numpy as np 
import numpy.random 
import matplotlib.pyplot as plt 

# Generate some test data 
x = np.random.randn(8873) 
y = np.random.randn(8873) 

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50) 
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]] 

print extent 
print heatmap 
plt.clf() 
surf = plt.imshow(heatmap, extent=extent) 
plt.colorbar(surf, shrink=0.75, aspect=5) 
plt.show() 

và lưu tập tin SVG, nó sẽ containe ảnh PNG:

<g clip-path="url(#p6def4f5150)"> 
    <image height="347" width="315" x="115.127800906" xlink:href="data:image/png;base64, 

tôi sử dụng matplotlib, phiên bản 1.1.1 dưới OpenSUSE và Ubuntu Hệ điều hành.

+0

@tcaswell Tôi đã chỉnh sửa chủ đề chính – rth

Trả lời

9

Sử dụng pcolormesh nơi bạn đang sử dụng imshow nếu bạn muốn đầu ra vectơ.

Khi sử dụng pcolor hoặc pcolormesh bạn không thể nội suy hình ảnh, tuy nhiên. Mặt khác, bạn có thể không muốn nội suy nếu bạn muốn đầu ra vectơ.

Đó là lý do cơ bản cho sự khác biệt giữa imshowpcolor/pcolormesh. imshow tạo raster, trong khi pcolormeshpcolor tạo các bản vá hình chữ nhật.

Bạn cũng sẽ cần phải thay đổi một chút theo cách bạn vượt qua trong phạm vi của hình ảnh. Như một ví dụ dựa trên của bạn:

import numpy as np 
import numpy.random 
import matplotlib.pyplot as plt 

# Generate some test data 
x = np.random.randn(8873) 
y = np.random.randn(8873) 

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50) 

surf = plt.pcolormesh(xedges, yedges, heatmap) 
plt.axis('image') 
plt.colorbar(surf, shrink=0.75, aspect=5) 
plt.show() 

enter image description here

Khi bạn lưu như một svg, sản lượng sẽ là bản vá lỗi vector. Ví dụ.

... 
    <g id="QuadMesh_1"> 
    <defs> 
    <path d=" 
M75.9063 -43.2 
L82.9705 -43.2 
L82.9705 -50.112 
L75.9063 -50.112 
L75.9063 -43.2" id="C0_0_9d1ab33858"/> 
    <path d=" 
M82.9705 -43.2 
L90.0348 -43.2 
L90.0348 -50.112 
L82.9705 -50.112 
L82.9705 -43.2" id="C0_1_d828245e6a"/> 
... 
+0

cảm ơn! nó hoạt động! :) Bạn có thể giải thích điều này: 'plt.axis (' image ')'? – rth

+0

Nó đặt tỷ lệ khung hình của ô thành 1 (nghĩa là pixel vuông sẽ là hình vuông) và cắt bớt các giới hạn. Nó chỉ ở đó để đầu ra trông giống như 'imshow'. –

Các vấn đề liên quan