Matplotlib boxplot + imageshow(子图)

时间:2014-03-16 19:15:36

标签: python matplotlib boxplot subplot

我正在做一些数据可视化方法,其中一个方法是用这个数据的方框图显示数据,如下所示:

def generate_data_heat_map(data, x_axis_label, y_axis_label, plot_title, file_path, box_plot=False):
    plt.figure()
    plt.title(plot_title)
    if box_plot:
        plt.subplot(1, 2, 1)
        plt.boxplot(data.data.flatten(), sym='r+')
        plt.subplot(1, 2, 2)

    fig = plt.imshow(data.data, extent=[0, data.cols, data.rows, 0])
    plt.xlabel(x_axis_label)
    plt.ylabel(y_axis_label)
    plt.colorbar(fig)
    plt.savefig(file_path + '.png')
    plt.close()

使用此代码,这是我得到的图像:

enter image description here

首先,我不知道为什么我的传单没有表示为红色+,而是标准模式。除此之外,由于我想并排绘制框图和数据,我划分了我的绘图区域。但这个空间是平分的,人物情节变得非常糟糕。我想盒子图占用了绘图区域的1/3,数据是2/3。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

错误是matplotlib代码的一个简单错误。你正在密谋你自己的形象。

你在哪里:

if box_plot:
    plt.subplot(1, 1, 1)
    plt.boxplot(data.data)
    plt.subplot(1, 2, 2)

您需要在对plt.subplots

的两次调用中指定子行的两行

这样可行。

if box_plot:
    plt.subplot(1, 2, 1)
    plt.boxplot(data.data)
    plt.subplot(1, 2, 2)

如果您想独立调整绘图大小,则可以使用gridspec。您可能想要将它们绘制在彼此之上......就像这样...

import numpy as np
from matplotlib import pyplot as plt
import matplotlib.gridspec as gridspec


def generate_data_heat_map(data, x_axis_label, y_axis_label, plot_title, file_path, box_plot=False):
    plt.figure()
    gs = gridspec.GridSpec(2, 1,height_ratios=[1,4])
    if box_plot:
        plt.subplot(gs[0])
        plt.boxplot(data.data.flatten(), 0, 'rs', 0)
        plt.subplot(gs[1])

    plt.title(plot_title)    
    fig = plt.imshow(data.data, extent=[0, data.cols, data.rows, 0])
    plt.xlabel(x_axis_label)
    plt.ylabel(y_axis_label)
    plt.colorbar(fig)
    plt.savefig(file_path + '.png')
    plt.close()

class Data(object):
    def __init__(self, rows=200, cols=300):
        # The data grid
        self.cols = cols
        self.rows = rows
        # The 2D data structure
        self.data = np.zeros((rows, cols), float)

    def randomise(self):
        self.data = np.random.rand(*self.data.shape)

data = Data()
data.randomise()
generate_data_heat_map(data, 'x', 'y', 'title', 'heat_map', box_plot=True)

nice plot