На логарифмической оси паразитов matplotlib отмечается нежелательное зеркальное кольцо

Я пытаюсь построить график с двумя осями Y, одна из которых логарифмическая, а другая линейная, используя host_subplot из mpl_toolkits.axes_grid1. Фигура выглядит нормально, за исключением незначительных штрихов на вторичной оси Y (справа), которые также отображаются на основной оси Y (слева) внутри фигуры.

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA

host = host_subplot(111)
host.set_yticks(np.arange(-12, -3, 1.0))

par1 = host.twinx()
par1.set_ylim( 2.7040e+3, 1.3552e+7)
par1.set_yscale('log')

minorLocator_x1 = MultipleLocator(0.3333)
minorLocator_y1 = MultipleLocator(0.5)
host.xaxis.set_minor_locator(minorLocator_x1)
host.yaxis.set_minor_locator(minorLocator_y2)

График выглядит следующим образом. Вы можете видеть, как отметки правой оси Y отражаются на левой оси Y

Я могу исправить зеркальные тики малой логарифмической оси, используя:

host = host_subplot(111, axes_class=AA.Axes)

Однако это создает другую проблему, а именно то, что метки деления оси x отображаются внутри фигуры, как и метки оси x.

Теперь метка x не переместится, даже если я попытаюсь вручную сместить.

Есть идеи, как обойти проблемы?


person mannaroth    schedule 22.06.2014    source источник
comment
Не могли бы вы выложить цифру? Я не совсем понимаю, что вы имеете в виду, говоря, что метки в виде галочки отображаются внутри рисунка.   -  person Aung    schedule 23.06.2014
comment
Хм, у меня такое же незначительное зеркальное отображение тиков, что и у вас (что странно ...), но ваше предложение об использовании AA.Axes исправляет все в моем (x тиков в норме). Я использую matplotlib версии 1.3.1, какую версию вы используете?   -  person Ajean    schedule 23.06.2014
comment
Я отредактировал пост, чтобы показать цифры. Я использую matplotlib 1.1.1rc (централизованная установка программного обеспечения). Спасибо!   -  person mannaroth    schedule 23.06.2014


Ответы (1)


Я нашел обходной путь, который решает проблему, но не с помощью host_subplot из mpl_toolkits.axes_grid1. Вместо этого я использую оси matplotlib следующим образом:

fig, ax1 = plt.subplots()

ax1.set_xlim(-0.25, 5.1)
ax1.set_ylim(-3.75, -13)
ax2=ax1.twinx()

ax1.set_xlabel('X-label', fontdict=font)
ax1.set_ylabel('Y1-label$', rotation='horizontal', fontdict=font)
ax2.set_ylabel('Y2-label', rotation='horizontal', fontdict=font)

ax2.set_ylim(2.7040e+3,  1.3552e+7)
ax2.set_yscale('log')
ax1.set_yticks(np.arange(-12, -3, 1.0))

ml = MultipleLocator(0.5)
minorLocator = MultipleLocator(0.3333)
ax1.xaxis.set_minor_locator(minorLocator)
ax1.yaxis.set_minor_locator(ml)

Это дает правильный сюжет. Мне кажется, что раньше проблема заключалась в нечетком назначении тиков (set_minor_locator) в первом случае (без использования axes_class = AA.Axes в host_subplot).

person mannaroth    schedule 23.06.2014
comment
Рад, что у вас все получилось! Разница между версиями может означать, что поведение оси x было некорректным и исправлено где-то посередине. Вы можете сообщить об ошибке / функции для зеркального отображения тиков, я не думаю, что это вообще должно происходить ... :) - person Ajean; 23.06.2014