semilogy绘图无法正确设置y轴刻度颜色问题求助
问题:semilogy对数轴刻度颜色异常的优化解决方法
问题出在*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轴均覆盖至少两个log10量级,刻度颜色设置正常:示例图1:左y轴为蓝色对数刻度,右y轴为红色对数刻度,所有刻度颜色匹配正确,无额外非对数刻度
- 调用
plot_me(np.arange(.1, .3, 1e-2))时,左右y轴均未覆盖两个log10量级,此时轴上除对数刻度外还出现非对数刻度,无法为其正确设置颜色:示例图2:轴上混杂非对数刻度,这类刻度未被设置对应颜色,与预期的单色对数轴不符
另外,semilogy的get_yticks()返回的均为对数刻度,这与绘图显示的非对数刻度标签矛盾:
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)可实现正确着色,但过程繁琐,恳请提供更优解决方法。
内容的提问来源于stack exchange,提问作者Xopi García
相关产品推荐
相关产品推荐

