问题出在**semilogy
**上,而不是twinx
上。来自下一个代码
import numpy as np
import matplotlib.pyplot as plt
def plot_me(x):
fig, ax1 = plt.subplots()
ax1.semilogy(x, color="blue")
for label in ax1.get_yticklabels():
label.set_color("blue")
ax2 = ax1.twinx()
ax2.semilogy(1/x, 'red')
for label in ax2.get_yticklabels():
label.set_color("red")
plot_me(np.arange(.1, 1.3, 1e-1))
在左边的y轴上通过1 e-1和1 e0,在右边通过另外两个日志。一切正常:
另一方面,plot_me(np.arange(.1, .3, 1e-2))
没有通过至少两个log 10(无论是在左还是右y轴),因此两个轴都留出了1个log 10 y-tick也没有log 10 y-tick,我不能正确的颜色:
此外,来自semilog
的y刻度都是log 10,这与我们在之前图的y刻度标签中看到的相矛盾!
def print_y_ticks(x):
fig, ax1 = plt.subplots()
ax1.semilogy(x, color="blue")
for label in ax1.get_yticklabels():
label.set_color("blue")
print(ax1.get_yticks())
return ax1
ax = print_y_ticks(np.arange(.1, 1.3, 1e-1)) # [1.e-03 1.e-02 1.e-01 1.e+00 1.e+01 1.e+02]
ax = print_y_ticks(np.arange(.1, .3, 1e-2)) # [1.e-03 1.e-02 1.e-01 1.e+00 1.e+01]
我的解决方案是下一个:
import numpy as np
import matplotlib.pyplot as plt
def ticks2log(ax):
yticks = ax.get_yticks()
ax.set_yticks(yticks, [f'{k:.1e}' for k in yticks])
return ax
def plot_me_new(x1, x2):
x1 = np.log10(x1)
x2 = np.log10(x2)
fig, ax1 = plt.subplots()
ax1.plot(x1, lw=2, color="blue")
ax1 = ticks2log(ax1)
for label in ax1.get_yticklabels():
label.set_color("blue")
ax2 = ax1.twinx()
ax2.plot(x2, lw=2, color="red")
ax2 = ticks2log(ax2)
for label in ax2.get_yticklabels():
label.set_color("red")
x = np.arange(.1, .3, 1e-2); plot_me_new(x, 1/x)
的结果是适当的颜色,但更繁琐。
提前感谢您的帮助!
PD:问题与**semilogy
**有关,与twinx
无关。
1条答案
按热度按时间abithluo1#
由JohanC解决