2015-04-02 8 views
7

के लिए उपयोग किए जाने वाले पॉप्युलेट प्रदर्शित नहीं होते हैं, मैं पाइथन 3.4 (उदाहरण here) में matplotlib का उपयोग करके मैटलैब शैली सहसंबंध प्लॉट का उत्पादन करने के लिए एक फ़ंक्शन लिखने की कोशिश कर रहा हूं। हालांकि, मैं साजिश को बदलना चाहता हूं ताकि विकर्ण उप-स्थान चर के नाम को प्रदर्शित कर सकें, निचले त्रिकोण सबप्लॉट्स पियरसन सहसंबंध गुणांक प्रदर्शित करते हैं, और ऊपरी त्रिकोण उपखंड एक स्कैटर प्लॉट प्रदर्शित करते हैं। नमूना डेटा और मेरे द्वारा लिखे गए फ़ंक्शन को उत्पन्न करने के लिए नीचे कुछ कोड दिया गया है। यह सही जगह पर परिवर्तनीय नाम और सहसंबंध गुणांक के साथ उप-स्थान के उपयुक्त 4x4 ग्रिड प्रदर्शित करता है, लेकिन स्कैटर प्लॉट दिखाई नहीं देते हैं।matplotlib स्कैटर प्लॉट्स प्रदर्शित नहीं होते हैं जब लूप

fig, ax = plt.subplots(2, 2, sharex = "col", sharey = "row") 
fig.subplots_adjust(wspace = 0, hspace = 0) 
ax[0, 0].text(0.5, 0.5, 'Var0', transform = ax[0, 0].transAxes) 
ax[0, 1].scatter(data[:, i], data[:, j], marker = '.') 
ax[1, 0].text(0.5, 0.5, '0.5', transform = ax[1, 0].transAxes) 
ax[1, 1].text(0.5, 0.5, 'Var1', transform = ax[1, 1].transAxes) 
plt.show() 

चूंकि यह काम करता है,:

import numpy as np 
import matplotlib.pyplot as plt 

means = [0, 1, 0, 2] 
sig = [[1, 0.5, 0, -0.1], [0.5, 3, 0, 0.2], [0, -0.1, 1, -0.3], [-0.1, 0.2, -0.3, 1]] 
data = np.random.multivariate_normal(means, sig, 50) 
names = ['Var' + str(i) for i in range(data.shape[1])] 

def corrplot(data, names): 
    corrMat = np.corrcoef(data, rowvar = 0) 
    numVars = data.shape[1] 

    fig, ax = plt.subplots(numVars, numVars, sharex = "col", sharey = "row") 
    fig.subplots_adjust(wspace = 0, hspace = 0) 

    for i in range(numVars): 
     for j in range(numVars): 
      if i == j: # On the diagonal 
       ax[i, j].text(0.5, 0.5, names[i], transform = ax[i, j].transAxes) 
      elif i < j: # In the upper triangle 
       ax[i, j].scatter(data[:, i], data[:, j], marker = '.') 
      elif i > j: # In the lower triangle 
       ax[i, j].text(0.5, 0.5, str(round(corrMat[i, j], 3)), transform = ax[i, j].transAxes) 
    plt.show() 

समस्या के स्रोत की पहचान करने की कोशिश में, मैं मैन्युअल रूप से भूखंड एक 2 चर मामले निम्नलिखित कोड है, जो वांछित साजिश का उत्पादन प्रयोग करने के लिए पुनर्निर्माण मैंने अनुमान लगाया कि समस्या को सबप्लॉट्स में टेक्स्ट और डेटा मिश्रण करने के साथ कुछ लेना देना नहीं था। मैंने फॉर लूप का उपयोग करके सबप्लॉट्स को पॉप्युलेट करने का परीक्षण करने के लिए अगला फ़ंक्शन लिखा था, और यह उम्मीद के अनुसार प्रत्येक सबप्लॉट में स्कैटर प्लॉट का उत्पादन करता है।

def test1(data): 
    numVars = data.shape[1] 
    fig, ax = plt.subplots(numVars, numVars, sharex = "col", sharey = "row") 
    fig.subplots_adjust(wspace = 0, hspace = 0) 

    for i in range(numVars): 
     for j in range(numVars): 
      ax[i, j].scatter(data[:, i], data[:, j], marker = '.') 
    plt.show() 

इसके बाद, मैं छोरों के लिए उपयोग कर subplots का केवल एक उपसमूह को भरने के लिए कोशिश की। यह निम्नानुसार एक खाली ग्रिड पैदा करता है।

def test2(data): 
    numVars = data.shape[1] 
    fig, ax = plt.subplots(numVars, numVars, sharex = "col", sharey = "row") 
    fig.subplots_adjust(wspace = 0, hspace = 0) 

    for i in range(numVars): 
     for j in range(i + 1, numVars): 
      ax[i, j].scatter(data[:, i], data[:, j], marker = '.') 
    plt.show() 

इस ओर जाता है मुझे विश्वास है छोरों और कैसे बिखराव भूखंडों बनाए जा रहे हैं के लिए से संबंधित कुछ त्रुटि है कि वहाँ है, लेकिन मैं अभी तक त्रुटि ढूँढने में सक्षम नहीं किया गया है।

+0

हाय इसे बदलना और कोशिश कर सकते अतः आपका स्वागत है! एक एमसीवीई बनाने के लिए कुडोस, यह बहुत सराहना की है। यह 100% कार्यात्मक नहीं है, हालांकि, मुझे श्रेणी में डेटा के लिए नामों की परिभाषा को 'नाम = [' Var '+ str (i) में बदलने की आवश्यकता है (data.shape [1])]' ('str' के लिए स्ट्रिंग और आप 'रेंज' भूल गए)। एक बार मैंने ऐसा किया और 'corrplot' पर एक कॉल जोड़ा, मुझे वास्तव में परिणाम ठीक करने के लिए मिला। आप matplotlib का क्या संस्करण उपयोग कर रहे हैं? – Ajean

+0

मैं matplotlib 1.4.3 का उपयोग कर रहा हूँ। मैं एनाकोंडा वितरण का उपयोग करता हूं और यह सुनिश्चित करने के लिए कल सबकुछ अपडेट करता हूं कि पुराना संस्करण मुद्दा नहीं था। –

+0

क्या आपके पास डिफ़ॉल्ट आरसीपीएआरएम्स में कोई बदलाव है? यही एकमात्र चीज है जिसके बारे में मैं सोच सकता हूं कि उन बिंदुओं को गायब कर दिया जा सकता है। शीर्ष पर 'plt.rcdefaults()' डालने का प्रयास करें और देखें कि आपको क्या मिलता है। – Ajean

उत्तर

1

आपका कोड बिल्कुल वांछित साजिश दिखाता है। मुझे लगता है कि matplolib के अपने संस्करण को नहीं पहचाना marker = '.'

आप (marker = '.' के बिना) डिफ़ॉल्ट मार्कर के साथ साजिश या साथ marker = 'o'

+0

आखिरकार मुझे एक अलग समाधान मिला जो matplotlib का उपयोग नहीं करता था। हालांकि, matplotlib के एक नए संस्करण के साथ इसका पुनरीक्षण, यह पूरी तरह से काम करता है। जवाब के लिए धन्यवाद; इसने मुझे इस पर फिर से विचार किया और महसूस किया कि यह वास्तव में काम करता है। –

संबंधित मुद्दे