3 года с разными масштабами, нанесенными с помощью matplotlib - PullRequest
0 голосов
/ 05 июня 2018

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

РЕДАКТИРОВАТЬ: У меня естьданные для построения a (t) = t ^ (1/2), и я могу изменить масштаб по оси a, потому что я знаю преобразование z (a) = 1 / a - 1, так что это похоже на построение z (t)), но я хочу, чтобы a (t) и z (t) выглядели одинаково, изменяя способ отображения оси y, поэтому оси a и z эквивалентны, подчиняясь z (a).

Проблема в том, что на графике показаны 3 кривые, как если бы это были разные функции, и я хочу, чтобы они выглядели одинаково, поэтому я не доверяю преобразованиям для каждой оси y.

Конкретный вопроскак я могу просто изменить масштаб оси Y.

Это то, что я сделал:

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

t_arr = np.linspace(-8,0,500)
t_arr = 10**t_arr
a_arr = [ti**(1./2) for ti in t_arr]
z_arr = [(1./ai - 1) for ai in a_arr]
T_arr = [1e-5*(1./ai) for ai in a_arr]

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

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

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

host.set_xlabel('Time')
host.set_ylabel("Scale Factor a")
par1.set_ylabel("Redshift z")
par2.set_ylabel("Energy E")

p1, = host.plot(t_arr, a_arr)
p2, = par1.plot(t_arr, z_arr)
p3, = par2.plot(t_arr, T_arr)

host.set_xscale('log')
host.set_yscale('log')
par1.set_xscale('log')
par1.set_yscale('log')
par2.set_xscale('log')
par2.set_yscale('log')

host.set_xlim([1e-8, 1])
host.set_ylim([1e-4, 1e2])
par1.set_ylim([9999,-0.99])
par2.set_ylim([0.1, 9e-6])

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))

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

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()

This is the plot I get.

...