(重编辑:)
在python matplotlib中,我想要y
对x
绘制两个xscales,较低的一个带有线性刻度,上面一个带有对数刻度。
较低的x
值是较高的{em>任意函数(在这种情况下,映射为func(x)=np.log10(1.0+x)
)。推论:较高x
刻度位置与较低位置的任意函数相同。
两个轴的数据点位置和刻度位置必须解耦。
我希望上轴的对数刻度位置和标签尽可能整齐。
制作这样一个情节的最佳方法是什么?
相关: http://matplotlib.1069221.n5.nabble.com/Two-y-axis-with-twinx-only-one-of-them-logscale-td18255.html
类似(但没有答案)的问题?: Matplotlib: how to set ticks of twinned axis in log plot
答案 0 :(得分:0)
您可能会发现Axes.twiny()
和Axes.semilogx()
很有用。
import numpy as np
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
x = np.arange(0.01, 10.0, 0.01) # x-axis range
y = np.sin(2*np.pi*x) # simulated signal to plot
ax1.plot(x, y, color="r") # regular plot (red)
ax1.set_xlabel('x')
ax2 = ax1.twiny() # ax1 and ax2 share y-axis
ax2.semilogx(x, y, color="b") # semilog plot (blue)
ax2.set_xlabel('semilogx')
plt.show()
答案 1 :(得分:0)
在与少数人交谈并感谢@BusyBeaver后,尝试回答。
我同意这个问题是不合适的,并会修改它以澄清(帮助欢迎!)。
我认为这是写下stackoverflow的一个有用的。
代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
# Necessary functions
def tick_function(x):
"""Specify tick format"""
return ["%2.f" % i for i in x]
def func(x):
"""This can be anything you like"""
funcx=np.log10(1.0+x)
return funcx
z=np.linspace(0.0,4.0,20)
np.random.seed(seed=1234)
y=np.random.normal(10.0,1.0,len(z))
# Set up the plot
fig,ax1 = subplots()
ax1.xaxis.set_minor_locator(AutoMinorLocator())
ax1.yaxis.set_minor_locator(AutoMinorLocator())
# Set up the second axis
ax2 = ax1.twiny()
# The tick positions can be at arbitrary positions
zticks=np.arange(z[0],z[-1]+1)
ax2.set_xticks(func(zticks))
ax2.set_xticklabels(tick_function(zticks))
ax2.set_xlim(func(z[0]),func(z[-1]))
ax1.set_ylim(5.0,15.0)
ax1.set_xlabel(r'$\log_{10}\left(1+z\right)$')
ax2.set_xlabel(r'$z$')
ax1.set_ylabel('amplitude/arb. units')
plt.tick_params(axis='both',which = 'major', labelsize=8, width=2)
plt.tick_params(axis='both',which = 'minor', labelsize=8, width=1)
_=ax1.plot(func(z),y,'k.')
plt.savefig('lnopz2.png')
我不确定如何控制上部ax2次要刻度(例如每0.5次)。