我正在做一些数据可视化的方法,其中之一是用该数据的箱线图显示数据,如下所示:
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()
使用这段代码,这是我得到的图像:
首先,我不明白为什么我的传单没有用红色+表示,而是用标准图案表示。除此之外,因为我想并排绘制箱线图和数据,所以我划分了绘图区域。但这个空间被均分,图形情节变得非常糟糕。我希望箱线图占绘图面积的 1/3,数据占 2/3。
提前谢谢您。
最佳答案
该错误是您的 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)
关于python - Matplotlib boxplot + imageshow(子图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22441577/