Возможно ли показать пользовательское изображение в виде оси x matplotlib [duplicate]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

10
задан benson 4 January 2012 в 22:29
поделиться

1 ответ

Я бы удалил метки меток и заменил текст на патчи . Вот краткий пример выполнения этой задачи:

import matplotlib.pyplot as plt
import matplotlib.patches as patches


# define where to put symbols vertically
TICKYPOS = -.6

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10))

# set ticks where your images will be
ax.get_xaxis().set_ticks([2,4,6,8])
# remove tick labels
ax.get_xaxis().set_ticklabels([])


# add a series of patches to serve as tick labels
ax.add_patch(patches.Circle((2,TICKYPOS),radius=.2,
                            fill=True,clip_on=False))
ax.add_patch(patches.Circle((4,TICKYPOS),radius=.2,
                            fill=False,clip_on=False))
ax.add_patch(patches.Rectangle((6-.1,TICKYPOS-.05),.2,.2,
                               fill=True,clip_on=False))
ax.add_patch(patches.Rectangle((8-.1,TICKYPOS-.05),.2,.2,
                               fill=False,clip_on=False))

Это приводит к следующему рисунку:

enter image description here [/g2]

чтобы установить clip_on на False, в противном случае patches вне осей не будут показаны. Координаты и размеры (радиус, ширина, высота и т. Д.) Патчей будут зависеть от того, где ваши оси находятся на рисунке. Например, если вы планируете делать это с помощью подзаголовков, вам нужно быть чувствительным к размещению патчей, чтобы не перекрывать другие оси. Возможно, стоит потратить время на исследование Transformations и определить позиции и размеры в другом блоке (оси, рисунок или дисплей).

Если у вас есть определенные файлы изображений, которые вы хотите использовать для символов, вы можете использовать класс BboxImage для создания художников, которые будут добавлены к осям вместо патчей. Например, я сделал простую иконку со следующим скриптом:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(1,1),dpi=400)
ax = fig.add_axes([0,0,1,1],frameon=False)
ax.set_axis_off()

ax.plot(range(10),linewidth=32)
ax.plot(range(9,-1,-1),linewidth=32)

fig.savefig('thumb.png')

, создавая это изображение:

enter image description here [/g3]

Затем я создал BboxImage в месте, где я хочу ярлык метки и размера, который я хочу:

lowerCorner = ax.transData.transform((.8,TICKYPOS-.2))
upperCorner = ax.transData.transform((1.2,TICKYPOS+.2))

bbox_image = BboxImage(Bbox([lowerCorner[0],
                             lowerCorner[1],
                             upperCorner[0],
                             upperCorner[1],
                             ]),
                       norm = None,
                       origin=None,
                       clip_on=False,
                       )

Заметил, как я использовал преобразование transData для преобразования из единиц данных в единицы отображения, которые требуются в определение Bbox.

Теперь я прочитал изображение с помощью imread и установил его результаты (массив numpy) на данные bbox_image и добавил художника к осям:

bbox_image.set_data(imread('thumb.png'))
ax.add_artist(bbox_image)

Это приводит к обновленному рисунку: enter image description here [/g4]

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

from matplotlib.image import BboxImage,imread
from matplotlib.transforms import Bbox
23
ответ дан Yann 26 August 2018 в 13:01
поделиться
Другие вопросы по тегам:

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