Matplotlib создает странные неправильные графики

Вопрос или проблема

Я заполняю массив numpy нулями или единицами в зависимости от того, больше или меньше ли вычисленное значение по индексу данного массива. В результате получается массив из нулей и единиц. Matplotlib так не считает.

Сравнение вычисляется как d=sin(bpi/180)x+sin(api/180)cos(bpi180)*y

Уникальное выражение выводит “уникальные значения в пространстве [0. 1.]”.

Последнее изображение показывает тот же код с массивом True/False вместо 0/1.

import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np
tan=np.tan
sin=np.sin
cos=np.cos
pi=np.pi
x=4
y=3
Max=.3

sizeOfSpace=2000
alpha=np.linspace(-10, 10,sizeOfSpace)
beta=np.linspace(-10, 10,sizeOfSpace)

space=np.zeros((sizeOfSpace,sizeOfSpace))
for i,a in enumerate(alpha):
    for j,b in enumerate(beta):
        d=sin(b*pi/180)*x+sin(a*pi/180)*cos(b*pi*180)*y
        space[i,j]=int(0) if d<Max else int(1)
plt.imshow(space,cmap=plt.cm.gray)
plt.colorbar()
print(f'уникальные значения в пространстве {np.unique(space)}')

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

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

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

Есть ли какие-либо предложения, как создать бинарное изображение?

import numpy as np
import matplotlib.pyplot as plt

array = np.random.rand(100, 100) > 0.5

plt.imshow(array, cmap=’gray’)
plt.show()

  1. Элемент списка

Ответ или решение

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

Ваша текущая логика:

Вы используете следующую логику для заполнения массива space:

for i, a in enumerate(alpha):
    for j, b in enumerate(beta):
        d = sin(b * pi / 180) * x + sin(a * pi / 180) * cos(b * pi / 180) * y
        space[i, j] = int(0) if d < Max else int(1)

Проблемы:

  1. Ваша формула использования cos(b * pi * 180) должна быть с 180 в знаменателе (может быть опечатка).
  2. Вы используете int(0) и int(1) для заполнения массива, что допустимо, но это может привести к путанице при визуализации, если не правильно настроен цветовой масштаб.
  3. При использовании plt.imshow() можно использовать значения True и False, и тогда Matplotlib правильно интерпретирует эти значения как 1 и 0 при отображении.

Исправленный код:

Вот исправленный и улучшенный код с учетом вышеупомянутых замечаний:

import numpy as np
import matplotlib.pyplot as plt

tan = np.tan
sin = np.sin
cos = np.cos
pi = np.pi
x = 4
y = 3
Max = 0.3

sizeOfSpace = 2000
alpha = np.linspace(-10, 10, sizeOfSpace)
beta = np.linspace(-10, 10, sizeOfSpace)

space = np.zeros((sizeOfSpace, sizeOfSpace), dtype=np.bool_)
for i, a in enumerate(alpha):
    for j, b in enumerate(beta):
        d = sin(b * pi / 180) * x + sin(a * pi / 180) * cos(b * pi / 180) * y
        space[i, j] = d >= Max  # Используем логическое выражение

plt.imshow(space, cmap=plt.cm.gray)
plt.colorbar()
print(f'Уникальные значения в пространстве: {np.unique(space)}')
plt.show()

Объяснения изменений:

  1. Исправление углов: cos(b * pi / 180) вместо cos(b * pi * 180). Это важно, чтобы не получать неправильные значения из-за неверной единицы измерения.

  2. Максимальное значение: Использование d >= Max для заполнения массива логическими значениями (True/False) помогает Matplotlib правильно интерпретировать массив для визуализации.

  3. Тип данных: Установка dtype=np.bool_ для массива space позволит вас напрямую работать с логическими значениями.

Визуализация:

Используя plt.imshow, вы сможете получить бинарное изображение только с черным и белым цветом, где черный представляет 0, а белый 1.

Таким образом, данная версия кода должна корректно отображать бинарное изображение в зависимости от ваших расчетов, устраняя проблемы, которые были у вас ранее. Если у вас будут дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...