多个x轴,它们之间彼此非线性

6
我想用 matplotlib 绘制一个包含两个非线性 x 轴的图表。我想要绘制的图表如下所示:基本上,年龄取决于红移。它是非线性的并需要计算。我想把年龄和红移都作为 x 轴。如何实现?
2个回答

4
功能 twiny() 可能是你正在寻找的内容。
import matplotlib.pyplot as plt
plt.loglog(range(100))
ax1 = plt.gca()
ax2 = ax1.twiny()
ax2.set_xticks([100,80,50])
ax2.set_xticklabels(['0','1','2'])
ax1.set_xlabel('redshift')
ax2.set_xlabel('age')
plt.show()

example plot for twiny() function


我尝试过,但由于声望不够,无法发布图表。 - Kyler Brown
我不明白这个函数的意义。似乎两个x轴仍然是线性相关的。 - Fxyang
1
我猜你所说的“非线性”是指对数。xticks可以放置任意刻度,xticklabels可以给它们标上标签。希望这可以帮到你。 - Kyler Brown
我所说的非线性是指年龄可以通过积分从红移计算得出,这比对数函数更为复杂。 - Fxyang

0
我是这样做的:
from mpl_toolkits.axes_grid.parasite_axes import SubplotHost 
fig = plt.figure(1, figsize=(figwidth,figheight))
ax = SubplotHost(fig, 1,1,1) 
fig.add_subplot(ax)

#plotting as usual

ax2 = ax.twin() # ax2 is responsible for "top" axis and "right" axis
ax2.axis["right"].toggle(ticklabels=False)
ax2.xaxis.set_major_formatter(FuncFormatter(fmt_zToEta)) #set eta coord format

#with a function for the Z to eta transform for plot labels
def fmt_zToEta(x, pos=None):
    #...
    return transformed_label 

我也记得最初使用那个红移例子 ;-)

我认为SubPlotHost是必要的,但我不是100%确定,因为我从我的一个现有(子)图中拆出来时没有检查它是否可以正常运行。

编辑:另外,请参见https://dev59.com/JGkv5IYBdhLWcg3wjxhl#10517481


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接