2015-04-02 20 views
7

Tôi đang cố gắng viết một hàm để tạo các ô tương quan kiểu Matlab bằng cách sử dụng matplotlib trong Python 3.4 (ví dụ here). Tuy nhiên, tôi muốn thay đổi cốt truyện sao cho các đường con chéo hiển thị tên của biến, các ô con tam giác dưới hiển thị hệ số tương quan Pearson và các ô con tam giác phía trên hiển thị một ô phân tán. Dưới đây là một số mã để tạo dữ liệu mẫu và hàm tôi đã viết. Nó hiển thị lưới 4x4 thích hợp của các ô phụ có tên biến và hệ số tương quan ở đúng vị trí, nhưng các ô phân tán không hiển thị.các ô phân tán matplotlib không hiển thị khi được sử dụng cho vòng lặp

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() 

Trong một nỗ lực để xác định nguồn gốc của vấn đề, tôi tự tái tạo những âm mưu cho một trường hợp biến 2 sử dụng đoạn mã sau, trong đó sản xuất cốt truyện mong muốn:

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() 

Kể từ khi công trình này, Tôi đưa ra giả thuyết rằng vấn đề không liên quan gì đến việc trộn văn bản và dữ liệu trong các phần con. Tôi đã viết hàm tiếp theo để thử nghiệm populating các subplots bằng cách sử dụng một vòng lặp for, và nó tạo ra một âm mưu phân tán trong mỗi subplot như mong đợi.

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() 

Tiếp theo, tôi đã cố gắng chỉ điền một tập con của các tiểu sử dụng cho vòng lặp. Điều này tạo ra một lưới trống như sau.

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() 

Điều này khiến tôi tin rằng có một số lỗi liên quan đến vòng lặp và cách các ô phân tán được tạo, nhưng tôi chưa tìm thấy lỗi.

+0

Hi và hoan nghênh SO! Kudos cho việc tạo ra một MCVE, nó được nhiều đánh giá cao. Nó không phải là 100% chức năng, tuy nhiên, bạn cần phải thay đổi định nghĩa của tên thành 'names = ['Var' + str (i) cho i trong phạm vi (data.shape [1])]' (string to 'str' và bạn đã quên 'dải ô'). Một khi tôi đã làm điều đó và thêm một cuộc gọi đến 'corrplot', tôi thực sự có kết quả để làm việc tốt. Bạn đang sử dụng phiên bản matplotlib nào? – Ajean

+0

Tôi đang sử dụng matplotlib 1.4.3. Tôi sử dụng bản phân phối Anaconda và cập nhật mọi thứ ngày hôm qua để đảm bảo rằng phiên bản cũ không phải là vấn đề. –

+0

Bạn có bất kỳ thay đổi nào đối với rcParams mặc định không? Đó là điều duy nhất tôi có thể nghĩ về điều đó có thể khiến những chấm đó biến mất. Hãy thử đặt 'plt.rcdefaults()' ở trên cùng và xem những gì bạn nhận được. – Ajean

Trả lời

1

Mã của bạn hiển thị chính xác ô mong muốn. Tôi nghĩ rằng phiên bản của matplolib đã không nhận ra marker = '.'

Bạn có thể thử để vẽ với điểm đánh dấu mặc định (không có marker = '.') hoặc thay thế nó với marker = 'o'

+0

Cuối cùng tôi tìm thấy một giải pháp khác mà không sử dụng matplotlib. Tuy nhiên, xem lại điều này với một phiên bản mới hơn của matplotlib, nó hoạt động hoàn hảo. Cảm ơn câu trả lời; nó làm cho tôi xem lại điều này và nhận ra rằng nó thực sự hoạt động. –

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