Matplotlib के साथ एक 2D हीटमैप प्लॉट करना


139

Matplotlib का उपयोग करते हुए, मैं एक 2D हीट मैप को प्लॉट करना चाहता हूं। मेरा डेटा एक n-by-n Numpy सरणी है, प्रत्येक 0 और 1 के बीच मान के साथ है। इसलिए इस सरणी के तत्व (i, j) के लिए, मैं (i, j) में एक वर्ग प्लॉट करना चाहता हूं। हीट मैप, जिसका रंग सरणी में तत्व के मूल्य के लिए आनुपातिक है।

मैं यह कैसे कर सकता हूँ?


2
क्या आपने पोस्ट करने से पहले matplotlibगैलरी को देखा? उपयोग करने के कुछ अच्छे उदाहरण हैं imshow, pcolorऔर pcolormeshयही आप चाहते हैं
tmdavison

जवाबों:


188

imshow()मानकों के साथ समारोह interpolation='nearest'और cmap='hot'आप क्या चाहते हैं क्या करना चाहिए।

import matplotlib.pyplot as plt
import numpy as np

a = np.random.random((16, 16))
plt.imshow(a, cmap='hot', interpolation='nearest')
plt.show()

यहाँ छवि विवरण दर्ज करें


1
मुझे नहीं लगता कि प्रक्षेप को निर्दिष्ट करना आवश्यक है।
मिगेलमार्टिन

2
@ pyplot के डॉक के अनुसार मिगुएल मॉर्टिन: "यदि प्रक्षेप कोई नहीं है (इसका डिफ़ॉल्ट मान), तो rc image.interpolation के लिए डिफ़ॉल्ट"। इसलिए मुझे लगता है कि इसे शामिल करना आवश्यक है।
पी। कैमिलेरी

@ P.Camilleri एक्स और वाई अक्षों को कैसे स्केल करें? (केवल संख्याएँ बदलें, कोई ज़ूम नहीं)।
डोले

64

सीबॉर्न बहुत सारे मैनुअल काम का ख्याल रखता है और स्वचालित रूप से चार्ट आदि के किनारे एक ढाल बनाता है।

import numpy as np
import seaborn as sns
import matplotlib.pylab as plt

uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data, linewidth=0.5)
plt.show()

यहाँ छवि विवरण दर्ज करें

या, आप वर्ग मैट्रिक्स के ऊपरी / निचले बाएं / दाएं त्रिकोणों को भी प्लॉट कर सकते हैं, उदाहरण के लिए एक सहसंबंध मैट्रिक्स जो वर्ग है और सममित है, इसलिए सभी मानों को प्लॉट करना वैसे भी बेमानी होगा।

corr = np.corrcoef(np.random.randn(10, 200))
mask = np.zeros_like(corr)
mask[np.triu_indices_from(mask)] = True
with sns.axes_style("white"):
    ax = sns.heatmap(corr, mask=mask, vmax=.3, square=True,  cmap="YlGnBu")
    plt.show()

यहाँ छवि विवरण दर्ज करें


1
मैं प्लॉट प्रकार का बहुत शौकीन हूं, और आधा मैट्रिक्स उपयोगी है। दो प्रश्न: 1) पहले प्लॉट में छोटे वर्गों को सफेद रेखाओं द्वारा अलग किया जाता है, क्या वे संयुक्त हो सकते हैं? 2) सफेद रेखा की चौड़ाई अलग-अलग प्रतीत होती है, क्या यह एक कला है?
पी। कैमिलेरी

1
आप 'linewidth' तर्क का इस्तेमाल कर सकते हैं, जिसका इस्तेमाल मैंने पहले प्लॉट में किसी दूसरे प्लॉट के लिए किया था (उदाहरण के लिए दूसरे प्लॉट में), ताकि स्पॉट आउट किए जा सकें। लाइन की चौड़ाई केवल स्क्रीन शॉट के मुद्दों के कारण पहले प्लॉट में अलग-अलग दिखाई देती है, वे वास्तव में अलग-अलग नहीं होते हैं, उन्हें आपके द्वारा सेट किए गए निरंतर पर रहना चाहिए।
PyRsquared

हालांकि यह सच है - मुझे नहीं लगता कि सीबॉर्न का उपयोग करने वाली प्रतिक्रिया को एक प्रश्न के लिए पूर्ण माना जाना चाहिए जो विशेष रूप से मैटलपोटलिब बताता है।
baxx

28

2d numpyसरणी के लिए, बस उपयोग imshow()से आपको मदद मिल सकती है:

import matplotlib.pyplot as plt
import numpy as np


def heatmap2d(arr: np.ndarray):
    plt.imshow(arr, cmap='viridis')
    plt.colorbar()
    plt.show()


test_array = np.arange(100 * 100).reshape(100, 100)
heatmap2d(test_array)

उदाहरण कोड का हीटमैप

यह कोड एक निरंतर हीटमैप का उत्पादन करता है।

आप यहांcolormap से एक और बिल्ट-इन चुन सकते हैं ।


18

मैं matplotlib के pcolor / pcolormesh फ़ंक्शन का उपयोग करूंगा क्योंकि यह डेटा के गैर-समान अंतर की अनुमति देता है।

उदाहरण से लिया matplotlib :

import matplotlib.pyplot as plt
import numpy as np

# generate 2 2d grids for the x & y bounds
y, x = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))

z = (1 - x / 2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
# x and y are bounds, so z should be the value *inside* those bounds.
# Therefore, remove the last value from the z array.
z = z[:-1, :-1]
z_min, z_max = -np.abs(z).max(), np.abs(z).max()

fig, ax = plt.subplots()

c = ax.pcolormesh(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max)
ax.set_title('pcolormesh')
# set the limits of the plot to the limits of the data
ax.axis([x.min(), x.max(), y.min(), y.max()])
fig.colorbar(c, ax=ax)

plt.show()

pcolormesh प्लॉट आउटपुट


12

यह कैसे एक सीएसवी से यह करने के लिए है:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

# Load data from CSV
dat = np.genfromtxt('dat.xyz', delimiter=' ',skip_header=0)
X_dat = dat[:,0]
Y_dat = dat[:,1]
Z_dat = dat[:,2]

# Convert from pandas dataframes to numpy arrays
X, Y, Z, = np.array([]), np.array([]), np.array([])
for i in range(len(X_dat)):
        X = np.append(X, X_dat[i])
        Y = np.append(Y, Y_dat[i])
        Z = np.append(Z, Z_dat[i])

# create x-y points to be used in heatmap
xi = np.linspace(X.min(), X.max(), 1000)
yi = np.linspace(Y.min(), Y.max(), 1000)

# Z is a matrix of x-y values
zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic')

# I control the range of my colorbar by removing data 
# outside of my range of interest
zmin = 3
zmax = 12
zi[(zi<zmin) | (zi>zmax)] = None

# Create the contour plot
CS = plt.contourf(xi, yi, zi, 15, cmap=plt.cm.rainbow,
                  vmax=zmax, vmin=zmin)
plt.colorbar()  
plt.show()

कहां dat.xyzहै

x1 y1 z1
x2 y2 z2
...

1
बस एक छोटा सिर: मुझे क्यूबिक से विधि को या तो निकटतम या रैखिक में बदलना पड़ा क्योंकि क्यूबिक के परिणामस्वरूप बहुत सारे NaN थे क्योंकि मैं 0..1 के बीच छोटे मानों के साथ काम कर रहा हूं
Maikefer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.