2013-12-16 4 views
3

Я довольно новичок в python и хочу построить набор данных, используя гистограмму и схему нагрева ниже. Тем не менее, я немного запутался оВыравнивание нескольких графиков в matplotlib + numpy

  1. Как поставить заголовок выше как участков и
  2. Как вставить текст в ботами участки
  3. Как ссылаться на верхний и нижний участок

Для моей первой задачи я использовал title инструкцию, которая вставляется заголовок между обоими участками вместо того, чтобы его выше обоих участков

Для моей второй задачи я использовал инструкцию figtext. Тем не менее, я не мог видеть текст в любом месте сюжета. Я немного поиграл с параметрами x, y и fontsize без каких-либо успехов.

Вот мой код:

def drawHeatmap(xDim, yDim, plot, threshold, verbose): 
global heatmapList 
stableCells = 0 

print("\n[I] - Plotting Heatmaps ...") 
for currentHeatmap in heatmapList: 
    if -1 in heatmapList[currentHeatmap]: 
     continue 
    print("[I] - Plotting heatmap for PUF instance", currentHeatmap,"(",len(heatmapList[currentHeatmap])," values)") 
    # Convert data to ndarray 
    #floatMap = list(map(float, currentHeatmap[1])) 
    myArray = np.array(heatmapList[currentHeatmap]).reshape(xDim,yDim) 

    # Setup two plots per page 
    fig, ax = plt.subplots(2) 

    # Histogram   
    weights = np.ones_like(heatmapList[currentHeatmap])/len(heatmapList[currentHeatmap]) 
    hist, bins = np.histogram(heatmapList[currentHeatmap], bins=50, weights=weights) 
    width = 0.7 * (bins[1] - bins[0]) 
    center = (bins[:-1] + bins[1:])/2 
    ax[0].bar(center, hist, align='center', width=width) 
    stableCells = calcPercentageStable(threshold, verbose) 
    plt.figtext(100,100,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", fontsize=40) 


    heatmap = ax[1].pcolor(myArray, cmap=plt.cm.Blues, alpha=0.8, vmin=0, vmax=1) 
    cbar = fig.colorbar(heatmap, shrink=0.8, aspect=10, fraction=.1,pad=.01) 
    #cbar.ax.tick_params(labelsize=40) 
    for y in range(myArray.shape[0]): 
     for x in range(myArray.shape[1]): 
      plt.text(x + 0.5, y + 0.5, '%.2f' % myArray[y, x], 
      horizontalalignment='center', 
      verticalalignment='center', 
      fontsize=(xDim/yDim)*5 
      ) 

    #fig = plt.figure() 
    fig = matplotlib.pyplot.gcf() 
    fig.set_size_inches(60.5,55.5) 
    plt.savefig(dataDirectory+"/"+currentHeatmap+".pdf", dpi=800, papertype="a3", format="pdf") 
    #plt.title("Heatmap for PUF instance "+str(currentHeatmap[0][0])+" ("+str(numberOfMeasurements)+" measurements; "+str(sizeOfMeasurements)+" bytes)") 
    if plot: 
     plt.show() 
    print("\t[I] - Done ...") 

А вот мой выходной ток: output

ответ

2

Возможно, этот пример будет легче понять. Следует отметить:

  • Используйте fig.suptitle, чтобы добавить заголовок к началу рисунка.
  • Используйте ax[i].text(x, y, str), чтобы добавить текст к объекту Axes
  • Каждый объект топоры, ax[i] в вашем случае, содержит всю информацию об одном участке. Используйте их вместо вызова plt, который действительно работает только с одним подзадом на рисунок или для изменения всех подзаговоров сразу. Например, вместо вызова plt.figtext позвоните ax[0].text, чтобы добавить текст в верхний график.

Воспользуйтесь приведенным ниже кодом ниже или, по крайней мере, прочитайте его, чтобы получить представление о том, как использовать список ax.


import numpy as np 
import matplotlib.pyplot as plt 

histogram_data = np.random.rand(1000) 
heatmap_data = np.random.rand(10, 100) 

# Set up figure and axes 
fig = plt.figure() 
fig.suptitle("These are my two plots") 
top_ax = fig.add_subplot(211) #2 rows, 1 col, 1st plot 
bot_ax = fig.add_subplot(212) #2 rows, 1 col, 2nd plot 
# This is the same as doing 'fig, (top_ax, bot_ax) = plt.subplots(2)' 

# Histogram 
weights = np.ones_like(histogram_data)/histogram_data.shape[0] 
hist, bins = np.histogram(histogram_data, bins=50, weights=weights) 
width = 0.7 * (bins[1] - bins[0]) 
center = (bins[:-1] + bins[1:])/2 

# Use top_ax to modify anything with the histogram plot 
top_ax.bar(center, hist, align='center', width=width) 
# ax.text(x, y, str). Make sure x,y are within your plot bounds ((0, 1), (0, .5)) 
top_ax.text(0.5, 0.5, "Here is text on the top plot", color='r') 

# Heatmap 
heatmap_params = {'cmap':plt.cm.Blues, 'alpha':0.8, 'vmin':0, 'vmax':1} 

# Use bot_ax to modify anything with the heatmap plot 
heatmap = bot_ax.pcolor(heatmap_data, **heatmap_params) 
cbar = fig.colorbar(heatmap, shrink=0.8, aspect=10, fraction=.1,pad=.01) 

# See how it looks 
plt.show() 

enter image description here

+0

Другой вопрос, который придумал: Как бы вы добавить метки к отдельным осям? Например, bot_ax.xlabel ("test") не работает для меня. –

+0

Используйте 'set' и' get'. Например, 'bot_ax.set_xlabel ('label')' или 'top_ax.get_yticklabels()'. – wflynny

Смежные вопросы