Форсирование меток осей - Как включить входы x, y для матрицы Z, чтобы иметь чувствительные оси - PullRequest
0 голосов
/ 06 марта 2020

У меня есть Z-матрица, и когда я подключаю ее к pcolorme sh, она отлично работает и дает мне следующий график. Единственная проблема заключается в том, что на осях теперь отображаются индексы матрицы. Код, который я использовал для его создания, приведен ниже: enter image description here

#boo - most of the parameters like title,xyz labels, filename comes from command line
data = np.loadtxt((args.data),dtype=float, comments="#")
cmap = plt.get_cmap('bwr')
fig, ax0 = plt.subplots()
divnorm = colors.DivergingNorm(vmin=np.amin(data), vcenter=0, vmax=np.amax(data))
im0 = ax0.pcolormesh(data,norm=divnorm, cmap=cmap)
fig.colorbar(im0,ax=ax0)
ax0.set_title(str(title))
plt.xlabel(str(xlabel))
plt.ylabel(str(ylabel))
filename = str(prefix) + "."+ str(fileformat)
plt.savefig(filename)

Я хотел изменить масштаб оси X с коэффициентом 0,1 (в итоге я сделал это вручную, так как я не нашел обходного пути) и изменил ось y относительно другого массива (обратите внимание: вместо этого я не манипулирую Z-матрицей, я использую физически значимый экспериментальный массив значений - здесь, sortData - соответствует индексам матрицы ). Я изменил свой код следующим образом - ось x и yaxis кажутся в порядке, но моя тепловая карта выглядит иначе. Может кто-то пролить свет на это? Большое спасибо

enter image description here

    #foo
    Data = np.loadtxt((args.data),dtype=float, comments="#")
    sort = np.loadtxt((args.sortData),dtype=float, comments="#")

    fig, ax0 = plt.subplots()
    cmap = plt.get_cmap('bwr')
    divnorm = colors.DivergingNorm(vmin=np.amin(Data), vcenter=0, vmax=np.amax(Data))
    #  im0 = ax0.pcolormesh(Data,norm=divnorm, cmap=cmap)
    #  ax0.set_xscale(1, "linear")
    x = np.arange(0.0,10.6,0.1)  # need to set the ticks manually
    y = sort[:,1]
    X,Y = np.meshgrid(x,y)
    Z=z.reshape(len(y),len(x))
   im0 = ax0.pcolormesh(X,Y,Data,norm=divnorm, cmap=cmap)#, extent=[x.min(), x.max(), y.min(), y.max()])
   #im0 = ax0.pcolormesh(x,y,Data,norm=divnorm, cmap=cmap)#, extent=[x.min(), x.max(), y.min(), y.max()])

    cbar = fig.colorbar(im0,ax=ax0)

    if args.zlabel !=None:
         cbar.ax.set_ylabel(str(args.zlabel))
    ax0.set_title(str(args.title))
    plt.xlabel(str(args.xlabel))
    plt.ylabel(str(args.ylabel))
    filename = str(args.prefix) + "."+ str(args.fileformat)
    plt.savefig(filename)

РЕДАКТИРОВАТЬ 1: Когда я строю бу, ось y равномерно разнесена, так как мы имеем дело с матричными индексами. Когда я строю foo, это не так, поскольку значения массива, соответствующие этим индексам (не матрица данных, а внешний массив y, который имеет ту же тусклость, что и данные, но имеет значения, сохраненные в нем, соответствующие expt), не равно разнесены. Проблема в том, что значения y, соответствующие первым 5 индексам y матрицы данных, равны 1.32, 3.200, 3.311, 3.38, 3.40, и их значения x изменяются во всем диапазоне [от xmin до xmax]. Но между 0 и 5 (Y) есть гигантская капля красного цвета, которая идет горизонтально до конца xlim. Очевидно, что-то не так, но не могу понять, что это такое.

1 Ответ

1 голос
/ 06 марта 2020

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

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

title = 'Foo'
xlabel = 'X'
ylabel = 'Y'


rv = np.random.rand(100)  # uniform random vector
data = rv[:,None] - rv.T  # pairwise diffs

cmap = plt.get_cmap('bwr')
fig, ax = plt.subplots()
divnorm = colors.DivergingNorm(vmin=np.amin(data), vcenter=0, vmax=np.amax(data))
im0 = ax.pcolormesh(data, norm=divnorm, cmap=cmap)
fig.colorbar(im0, ax=ax)

# do tick labeling stuff here
nticks = 5 
x_tick_pos = np.linspace(0,100,nticks)
y_tick_pos = np.linspace(0,100,nticks)
ax.set_xticks(x_tick_pos)
ax.set_yticks(y_tick_pos)
xtick_labels = [str(x) for x in np.linspace(0, 10, nticks)] # can be any list of strings
ytick_labels = [str(y) for y in np.linspace(0, 10, nticks)] # len must match nticks
ax.set_xticklabels(xtick_labels)
ax.set_yticklabels(ytick_labels)
ax.set_title(title)
plt.xlabel(xlabel)
plt.ylabel(ylabel)

plt.show()

Обратите внимание, что если вы хотите делать более причудливые вещи, например, повернуть метки галочек, чтобы их было легче читать, вам может помочь проверка matplotlib учебник по маркировке тепловых карт .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...