imshow () неправильно показывает изображение - PullRequest
0 голосов
/ 26 марта 2020

Данные, которые я пытаюсь отобразить, представляют собой матрицу формы 5x64, которая называется 'field_matrix'

field_matrix = [
[0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 2 2 2 2 2 2 2 2 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]
[0 0 0 0 0 0 0 1 0 0 1 2 2 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0
 0 0 0 0 1 0 2 2 2 2 2 2 2 2 2 0 2 2 2 2 2 2 2 0 0 0 0]
[0 0 0 0 0 0 0 1 0 1 0 2 2 2 2 2 2 2 2 2 0 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 2 2 2 2 2 2 2 1 1 1 1 1]
[0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0
 2 2 2 2 2 2 2 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1]
[0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
 0 0 0 0 0 0 0 0 0 0 1 2 2 2 2 0 1 1 1 0 0 1 1 1 1 1 1]]

Код:

norm = mpl.colors.Normalize(vmin=0, vmax=3)
cmap = cm.Blues
mapper = cm.ScalarMappable(norm=norm, cmap=cmap)

#field_value_dict = {0: 'Sensor', 1: 'Multi-Value', 2: 'Constant', 3: 'Counter'}
field_value_dict = {2: 'Sensor', 1: 'Multi-Value', 0: 'Constant', 3: 'Counter'}

patch_list = []
for k,v in field_value_dict.items():
    patch = mpatches.Patch(color=mapper.to_rgba(k), label=v)
    patch_list.append(patch)

#print(patch_list)
plt.figure(figsize=(20, 12.5))
plt.imshow(field_matrix, interpolation='nearest', cmap=cmap, )

ax = plt.gca()
# Put a legend to the right of the current axis
# Shrink current axis by 20%
#box = ax.get_position()
#ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
#ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), handles=patch_list)
ax.legend(loc='center', bbox_to_anchor=(0.5, -0.5), handles=patch_list)

# Set the ticks and labels
plt.yticks(np.arange(5), [utilities.num2pid[k] for k in range(5)]) #num2pids will output '0000', 'F002', 'F003', 'F004', 'F005 -- but note that '0000' is missing from the image
plt.xticks(np.arange(-0.5, 60, 8.), np.arange(0, 64, 8))

# Set offset ticks to make the grid boxes surround the squares representing bits
ax.set_xticks(np.arange(-0.5, 64.5, 8.), minor=True)                                           
ax.set_yticks(np.arange(0.5, 20.5, 1.), minor=True)
plt.grid(which='minor')
plt.xlabel('bit')
plt.ylabel('ID')

fig_save_dir = os.path.expanduser('../figures/')
#filename = os.path.join(fig_save_dir, 'field_map.pgf')
filename = os.path.join(fig_save_dir, 'field_map_J1939-PGNs.png')
plt.savefig(filename)#, bbox_inches=2)

plt.show()

Проблема: каждый вектор (5 в итого) в матрице данных (field_matrix) имеет значение 0-3, и значение дает соответствующий цвет - см. изображение ниже и легенду.

Однако выходное изображение дает только 4 строки (F002, F003 , F004, F005), когда он также должен включать 0000, поскольку в этом графике должно быть 5 строк данных. Graphi c.

Я пытался устранить неполадки, используя аналогичные проблемы imshow () в стеке, но не могу исправить вопрос. Любые идеи?

Помимо вопроса - как довольно новый для matplotlib, знаете ли вы, как устранить пробелы в графике (обратите внимание, как изображение перекошено к вершине графика.

Спасибо!

Вывод из plt.show ()

1 Ответ

0 голосов
/ 26 марта 2020

По сути, вы делаете:

plt.yticks(np.arange(5), [utilities.num2pid[k] for k in range(5)]) #num2pids will output '0000', 'F002', 'F003', 'F004', 'F005 -- but note that '0000' is missing from the image

А затем:

ax.set_yticks(np.arange(0.5, 20.5, 1.), minor=True)

Итак, вторая строка перезаписывает yticks, измененный ранее на той же оси. Итак ... Я удалил вторую строку и сделал следующее:

plt.yticks(np.arange(0, 5), ['0000', 'F002', 'F003', 'F004', 'F005'])

Обратите внимание, что я использовал фиксированный список со значениями, которые вы ожидаете от utilities.num2pid[k]. потому что я не знаю эту функцию.

Я получил такой результат:

field_map

Надеюсь, это поможет.

...