Вопрос по pyqt, matplotlib, pyqt4, python – Сделайте обратные диагонали белыми в тепловой карте

9

Я пытаюсь что-то сделать, как показано на изображении ниже, enter image description here

Просто установив обратные диагонали белого цвета осталось. Я не могу установить их как белые. Диаграмма принимает целочисленные значения, и я не знаю, какое целочисленное значение соответствует белому цвету.

Поблагодарить!

Edited:

Вот код;

import math
from matplotlib import pyplot as plt
from matplotlib import cm as cm
import pylab
import numpy as np
from matplotlib.collections import LineCollection

class HeatMap:
    def __init__(self, selectedLines):
        self.selectedLines = selectedLines


    def getHeapMap(self):
        figure = plt.figure()

        if len(self.selectedLines) != 0:

            self.map = self.createTestMapData(len(self.selectedLines),                len(self.selectedLines))


            maxValueInMap = self.findMaxValueInMap(self.map)

            x = np.arange(maxValueInMap + 1)
            ys = [x + i for i in x]
            ax = figure.add_subplot(111)
            ax.imshow(self.map, cmap=cm.jet, interpolation='nearest')

            '''
            Left side label of the chart is created according to selected values
            from a checkbox group.
            '''
            leftSideLabelSize = len(self.selectedLines)
            sideLabels = []
            for line in self.selectedLines:
                sideLabels.append(line.text())
            pos = np.arange(leftSideLabelSize)
            '''
            Left side labels are set with the code below.
            '''
            pylab.yticks(pos, sideLabels)
            plt.xticks(pos, sideLabels)
            self.numrows, self.numcols = self.map.shape
            ax.format_coord = self.format_coord

            line_segments = LineCollection([zip(x, y) for y in ys],
                linewidths=(0.5, 3, 1.5, 2),
                linestyles='solid')
            line_segments.set_array(x)
            axcb = figure.colorbar(line_segments)

        return figure

    def format_coord(self, x, y):
        col = int(x + 0.5)
        row = int(y + 0.5)
        if col >= 0 and col < self.numcols and row >= 0 and row < self.numrows:
            z = self.map[row, col]
            return 'x=%1.4f, y=%1.4f, z=%1.4f' % (x, y, z)
        else:
            return 'x=%1.4f, y=%1.4f' % (x, y)

    def createTestMapData(self, xSize, ySize):
        resultMap = 10 * np.random.rand(xSize, ySize)
        #Setting reverse diagonal is here. Now it is set with zero but it gives blue.
        # I want it to be set as white
        for index in range(0, int(math.sqrt(resultMap.size))):
            resultMap[index][((math.sqrt(resultMap.size) - 1) - index )] = 0 
        return  resultMap

    def findMaxValueInMap(self, map):
        return np.amax(map)

Значения генерируются случайным образом в данный момент. Код выше дает графический интерфейс;

enter image description here

На самом деле я написал это с примерами галереи matplotlib. Я отредактировал вопрос. Ahmet DAL
Вы нарисовали это вручную или написали? Если это последнее, можем ли мы увидеть код? Blender

Ваш Ответ

2   ответа
1

cmap аргумент вax.imshow(), Вы использовалиjet цветовая карта, так что у вас естьcmap=cm.jet, который является лишь одним из многихвстроенные цветные карты в матплотлиб. Вы можете выбрать один или определить свой собственный, который соответствует вашему вкусу.

8

вующую :)

enter image description here

Вот код для приведенного выше сюжета с пояснениями в комментариях:

import matplotlib
from pylab import *
import numpy as np

#Create test data with zero valued diagonal:
data = np.random.random_sample((25, 25))
rows, cols = np.indices((25,25))
data[np.diag(rows, k=0), np.diag(cols, k=0)] = 0

#Create new colormap, with white for zero 
#(can also take RGB values, like (255,255,255):
colors = [('white')] + [(cm.jet(i)) for i in xrange(1,256)]
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256)

pcolor(data, cmap=new_map)
colorbar()
savefig('map.png')
show()

Кроме того, вы можете замаскировать свои данные и установить цвет маски:

#Create test data:
data = np.random.random_sample((25, 25))
#Create a diagonal mask:
mask = np.diag(np.ones(25))
#Apply mask to data:
masked_data = ma.masked_array(data, mask)
#Set mask color to white:
cm.jet.set_bad(color='white', alpha=None)
#for this to work we use pcolormesh instead of pcolor:
pcolormesh(masked_data, cmap=cm.jet)
colorbar()
show()

Это дает практически тот же результат, но может лучше удовлетворить ваши потребности, поскольку вы можете установить для любой ячейки белый цвет, а также белый цвет не отображается на цветовой панели (см. Самую нижнюю часть цветовой панели выше):

enter image description here

@ Шепот - Что идет не так? Он отлично работает для меня..
@ Шепотом - ах! Просто добавьxlim(0,11) а такжеylim(0,11) (или 13). Это потому, что matplollib неправильно угадывает границы осей .. :)
Можете ли вы попробовать это с 11 и 13 элементами. Я думаю, что есть ошибка Ahmet DAL
Верхняя и правая сторона видны как белые, когда есть 11 или 13 элементов. Ahmet DAL
Это работает. Большое вам спасибо :) Ahmet DAL

Похожие вопросы