Matplotlib - Можно ли создавать подзаговоры с паразитическими осями? - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать диаграмму с двумя вспомогательными участками, каждый из которых имеет ось паразита, как показано в документации здесь .Тем не менее, хотя я могу воспроизвести пример с одним графиком, он не работает с двумя вспомогательными участками.Может ли Matplotlib это сделать?

Вот мой код:

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

host = host_subplot(111, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)

plt.subplot(2,1,1)

par1 = host.twinx()
par2 = host.twinx()

offset = 60
new_fixed_axis = par2.get_grid_helper().new_fixed_axis
par2.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par2,
                                    offset=(offset, 0))

par1.axis["right"].toggle(all=True)
par2.axis["right"].toggle(all=True)

host.set_xlim(0, 2)
host.set_ylim(0, 2)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")

p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.legend()

host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right"].label.set_color(p3.get_color())

#####2#####
plt.subplot(2,1,2)
par1 = host.twinx()
par2 = host.twinx()

offset = 60
new_fixed_axis = par2.get_grid_helper().new_fixed_axis
par2.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par2,
                                    offset=(offset, 0))

par1.axis["right"].toggle(all=True)
par2.axis["right"].toggle(all=True)

host.set_xlim(0, 2)
host.set_ylim(0, 2)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")

p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.legend()

host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right"].label.set_color(p3.get_color())    


plt.draw()
plt.show()

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

Output

Извините, если я делаю что-то глупое!

Большое спасибо, Алекс

1 Ответ

0 голосов
/ 25 мая 2018

У вас там было несколько небольших ошибок.Прежде всего, команды plt.subplot(), в которых переопределяются ваши команды host_subplot() (см. Примечание в документации по matplotlib.pyplot.subplot () : «При создании подпункта удаляются все существующие ранее подпоплеты, которые перекрываются сэто за гранью границы ").Кроме того, вы должны отслеживать экземпляры для двух участков отдельно.Я решил это так, что создал host1, par11 и par12 для первых Axes и host2, par21 и par22 для второго Axes.Весь код теперь выглядит так:

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

fig = plt.figure()

host1 = host_subplot(211, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)

par11 = host1.twinx()
par12 = host1.twinx()

offset = 60
new_fixed_axis = par12.get_grid_helper().new_fixed_axis
par12.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par12,
                                    offset=(offset, 0))

par11.axis["right"].toggle(all=True)
par12.axis["right"].toggle(all=True)

host1.set_xlim(0, 2)
host1.set_ylim(0, 2)

host1.set_xlabel("Distance")
host1.set_ylabel("Density")
par11.set_ylabel("Temperature")
par12.set_ylabel("Velocity")

p1, = host1.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par11.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par12.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par11.set_ylim(0, 4)
par12.set_ylim(1, 65)

host1.legend()

host1.axis["left"].label.set_color(p1.get_color())
par11.axis["right"].label.set_color(p2.get_color())
par12.axis["right"].label.set_color(p3.get_color())

#####2#####
host2 = host_subplot(212, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)
par21 = host2.twinx()
par22 = host2.twinx()

offset = 60
new_fixed_axis = par22.get_grid_helper().new_fixed_axis
par22.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par22,
                                    offset=(offset, 0))

par21.axis["right"].toggle(all=True)
par22.axis["right"].toggle(all=True)

host2.set_xlim(0, 2)
host2.set_ylim(0, 2)

host2.set_xlabel("Distance")
host2.set_ylabel("Density")
par21.set_ylabel("Temperature")
par22.set_ylabel("Velocity")

p1, = host2.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par21.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par22.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par21.set_ylim(0, 4)
par22.set_ylim(1, 65)

host2.legend()

host2.axis["left"].label.set_color(p1.get_color())
par21.axis["right"].label.set_color(p2.get_color())
par22.axis["right"].label.set_color(p3.get_color())    

fig.tight_layout()

plt.draw()
plt.show()

И вот результат:

result of the above code

Надеюсь, это поможет.

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