Как автоматизировать графики imshow в python

#python #matplotlib #plot

#python #matplotlib #график

Вопрос:

Я хочу автоматизировать фигуру, ухудшающую imshow, с помощью python3. Я хотел бы предоставить фрейм данных, и это будет график, независимо от того, сколько столбцов задано.

Я попробовал это:

 vmin = 3.5
vmax = 6
fig, axes = plt.subplots(len(list(df.columns)),1)

for i,j in zip(list(df.columns),range(1,len(list(df.columns)) 1)):

    df = df.sort_values([i], ascending = False) 
    y = df[i].tolist()

    gradient = [y,y]

    plt.imshow(gradient, aspect='auto', cmap=plt.get_cmap('hot_r'), vmin=vmin, vmax=vmax)

    axes = plt.subplot(len(list(df.columns)),1,j)


sm = plt.cm.ScalarMappable(cmap=plt.get_cmap('hot_r'),norm=plt.Normalize(vmin,vmax))
sm._A = []
plt.colorbar(sm,ax=axes)

plt.show()
  

Моя проблема в том, что первый набор данных (первый столбец df) никогда не отображается. Также карта находится не там, где я хочу, чтобы она была. Это именно то, что я получаю:

Мой фактический результат

Но это то, что я хочу:

Мой желаемый результат

Ответ №1:

Вы не должны использовать plt.subplot , если вы уже создали свои подзаголовки с помощью plt.subplots .

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

f = lambda x, s: x*np.exp(-x**2/s)/2
df = pd.DataFrame({"A" : f(np.linspace(0,50,600),70) 3.5,
                   "B" : f(np.linspace(0,50,600),110) 3.5,
                   "C" : f(np.linspace(0,50,600),150) 3.5,})

vmin = 3.5
vmax = 6

fig, axes = plt.subplots(len(list(df.columns)),1)

for col, ax in zip(df.columns,axes.flat):

    df = df.sort_values([col], ascending = False) 
    y = df[col].values

    gradient = [y,y]

    im = ax.imshow(gradient, aspect='auto', 
                   cmap=plt.get_cmap('hot_r'), vmin=vmin, vmax=vmax)

# Since all images have the same vmin/vmax, we can take any of them for the colorbar
fig.colorbar(im, ax=axes)

plt.show()
  

введите описание изображения здесь

Комментарии:

1. Привет, спасибо за решение, но когда я пытаюсь запустить ваш скрипт, я получаю эту ошибку: AttributeError: объект ‘numpy.ndarray’ не имеет атрибута ‘get_figure’

2. В этом случае ваша версия matplotlib слишком устарела, чтобы использовать fig.colorbar(im, ax=axes) конструкцию для отображения цветовой панели помимо всех подзаголовков. Вы все равно можете использовать fig.colorbar(im) или создать оси для цветовой панели вручную cax = fig.add_axes([...]); fig.colorbar(im, cax=cax) .