Осевые линии обрезки в matplotlib [дубликат]

Я поздний участник этого вопроса, но я хочу упомянуть здесь, что строка «Программа для интерфейса, а не реализация» имела хорошее обсуждение в книге шаблонов дизайна GoF (Gang of Four).

На стр. 18:

Программа для интерфейса, а не для реализации

Не объявляйте переменные экземплярами конкретных конкретных классов. Вместо этого зафиксируйте только интерфейс, определенный абстрактным классом. Вы найдете это общей темой шаблонов проектирования в этой книге.

и выше этого, это началось с:

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

  1. Клиенты не знают о конкретных типах объектов, которые они используют, если объекты соответствуют интерфейсу, который ожидают клиенты.
  2. Клиенты не знают о классах, которые реализуют эти объекты. Клиенты знают только об абстрактном классе (ов), определяющем интерфейс.

Так, другими словами, не записывайте его в свои классы, чтобы он имел метод quack() для уток, а затем метод bark() для собак, поскольку они слишком специфичны для конкретной реализации класса (или подкласса). Вместо этого напишите метод, используя имена, которые являются достаточно общими для использования в базовом классе, например giveSound() или move(), чтобы их можно было использовать для уток, собак или даже автомобилей, а затем для клиента вашего классы могут просто сказать .giveSound(), а не думать о том, использовать ли quack() или bark() или даже определить тип перед выдачей правильного сообщения, которое должно быть отправлено объекту.

13
задан Michael Roberts 24 August 2015 в 16:10
поделиться

2 ответа

Вы можете адаптировать пример matplotlib для разрыва по оси x напрямую:

"""
Broken axis example, where the x-axis will have a portion cut out.
"""
import matplotlib.pylab as plt
import numpy as np


x = np.linspace(0,10,100)
x[75:] = np.linspace(40,42.5,25)

y = np.sin(x)

f,(ax,ax2) = plt.subplots(1,2,sharey=True, facecolor='w')

# plot the same data on both axes
ax.plot(x, y)
ax2.plot(x, y)

ax.set_xlim(0,7.5)
ax2.set_xlim(40,42.5)

# hide the spines between ax and ax2
ax.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax.yaxis.tick_left()
ax.tick_params(labelright='off')
ax2.yaxis.tick_right()

# This looks pretty good, and was fairly painless, but you can get that
# cut-out diagonal lines look with just a bit more work. The important
# thing to know here is that in axes coordinates, which are always
# between 0-1, spine endpoints are at these locations (0,0), (0,1),
# (1,0), and (1,1).  Thus, we just need to put the diagonals in the
# appropriate corners of each of our axes, and so long as we use the
# right transform and disable clipping.

d = .015 # how big to make the diagonal lines in axes coordinates
# arguments to pass plot, just so we don't keep repeating them
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
ax.plot((1-d,1+d), (-d,+d), **kwargs)
ax.plot((1-d,1+d),(1-d,1+d), **kwargs)

kwargs.update(transform=ax2.transAxes)  # switch to the bottom axes
ax2.plot((-d,+d), (1-d,1+d), **kwargs)
ax2.plot((-d,+d), (-d,+d), **kwargs)

# What's cool about this is that now if we vary the distance between
# ax and ax2 via f.subplots_adjust(hspace=...) or plt.subplot_tool(),
# the diagonal lines will move accordingly, and stay right at the tips
# of the spines they are 'breaking'

plt.show()

Для ваших целей просто запишите свои данные дважды (один раз на каждой оси, ax и ax2 и соответствующим образом установите xlim s. «Линии разрыва» должны двигаться в соответствии с новым прорывом, потому что они построены по относительной оси координаты, а не координаты данных.

Линии разрыва - это просто незакрепленные сюжетные линии, проведенные между двумя точками. Например, ax.plot((1-d,1+d), (-d,+d), **kwargs) показывает линию разрыва между точками (1-d,-d) и (1+d,+d) на первой оси: это нижний правый. Если вы хотите изменить градиент, измените эти значения соответствующим образом. Например, чтобы сделать это круче, попробуйте ax.plot((1-d/2,1+d/2), (-d,+d), **kwargs)

13
ответ дан xnx 22 August 2018 в 12:39
поделиться
  • 1
    Я добавлю то, что у меня есть до сих пор, но мои строки прерываний не так хороши, как ваш пример, как мне изменить их «градиент»? – Michael Roberts 24 August 2015 в 15:59
  • 2
    См. Мой обновленный вопрос. – Michael Roberts 24 August 2015 в 16:08
  • 3
    Линии разрыва - это просто незакрепленные сюжетные линии: см. Мое редактирование. – xnx 24 August 2015 в 16:09
  • 4
    Попытка того, что вы предложили, не делает их круче короче ... – Michael Roberts 24 August 2015 в 16:12
  • 5
    Отлично - рад, что это помогает! – xnx 24 August 2015 в 16:29

Решение, предоставляемое xnx, является хорошим началом, но остается проблема, что масштабы x-осей различны между графиками. Это не проблема, если диапазон в левом графике и диапазон на правом графике совпадают, но если они неравны, субплотность все равно даст двум графикам равную ширину, поэтому масштаб оси х будет отличаться между два графика (как в случае с примером xnx). Я сделал пакет, brokenaxes , чтобы справиться с этим.

6
ответ дан ben.dichter 22 August 2018 в 12:39
поделиться
Другие вопросы по тегам:

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