очистка размытой границы между хорошими и плохими данными в matplotlib imshow - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть 2D-данные, которые я пытаюсь отобразить с помощью imshow.Области данных - это нан, и они помечены как маскированные.

Из-за таких вещей, как анизотропия, я использую билинейную интерполяцию и хотел бы продолжать это делать.Используя is_bad, я почти уверен, что получаю замаскированные значения, которые отображаются так, как я хочу, но кажется, что цвет наночастиц сливается с хорошей частью данных, вызывая размытие.обострить интерфейс между данными nan и non-nan?Должен ли я определить границу и провести над ней линию или я могу сделать это с помощью параметров imshow?

Спасибо!

Eli

1 Ответ

2 голосов
/ 25 февраля 2012

Ну, это немного запутанное решение, но я не знаю лучшего.

Просто чтобы продемонстрировать проблему, о которой вы говорите, людям, которые могут с ней не знакомы:

import numpy as np
import matplotlib.pyplot as plt
data = np.random.random((10,10))
data[[2, 5, 7], [5, 8, 1]] = np.nan

plt.imshow(data)
plt.show()

enter image description here

Размытие связано с тем, что matplotlib интерполирует альфа-значения (прозрачность). Изменение этого потребует настройки низкого уровня.

Однако, если вам не нужно показывать слой под изображением в областях без данных, вы можете сделать что-то вроде этого:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# Generate some data...
data = np.random.random((10,10))
data[[2, 5, 7], [5, 8, 1]] = np.nan

# Convert it to a masked array instead of just using nan's..
data = np.ma.masked_invalid(data)

# Plot a version with the invalid data replaced with the mean...
plt.imshow(data.filled(data.mean()))

# Now plot a white (or whatever color you'd like), nearest-interpolated array
# over the invalid values...
bad_data = np.ma.masked_where(~data.mask, data.mask)
plt.imshow(bad_data, interpolation='nearest', cmap=mpl.cm.gray_r)

plt.show()

enter image description here

Если мы не построим исходные данные, используя «заполненную» версию (data.filled(data.mean())), мы получим «ореолы» вокруг заблокированных недействительных значений:

enter image description here

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