次要y轴

问题描述

最近,Sympy绘图发展了很多,但是我找不到在次级y轴上绘制第二个表达式的方法。在下面,我展示了一个示例,其中我合并了两个图,但希望第二个图使用辅助轴:

,

顺便说一句,有没有办法修改线条样式,例如让其中一个破灭?该文档建议使用awk -v ignore_field="1-5,6" ' BEGIN{ FS=OFS="," num=split(ignore_pos,array1,",") for(i=1;i<=num;i++){ if(array1[i]~/-/){ split(array1[i],array2,"-") for(j=array2[1];j<=array2[2];j++){ ignoreFields[j] } } else{ ignoreFields[array1[i]] } } } { for(i=1;i<=NF;i++){ val="" if(!(i in ignoreFields)){ val=(val?val OFS:"")$i } } $0=val } 1 ' Input_file 模块进行微调,但是我不清楚如何实现这一点。参见例如How do I use the `_backend` attribute of a Sympy `plot`

解决方法

this post中的方法可以进行如下调整。请注意,sympy将棘刺置于零位置,这与同一图中的两个轴相混淆。它们可以再次移动到其原始位置。 Matplotlib可以从两个轴的手柄和标签创建组合图例。

from sympy import Symbol,plot,sin
import matplotlib.pyplot as plt


def move_sympyplot_to_axes(p,ax,is_twinx):
    backend = p.backend(p)
    backend.ax = ax
    backend._process_series(backend.parent._series,backend.parent)
    if is_twinx:
        backend.ax.spines['left'].set_color('none')
    else:
        backend.ax.spines['right'].set_color('none')
        backend.ax.spines['left'].set_position(('axes',0))
    backend.ax.spines['bottom'].set_position(('axes',0))
    plt.close(backend.fig)

x = Symbol('x')
p1 = plot(x ** 4,(x,10,20),label='$x^4$',show=False)
p2 = plot(sin(10*x)/x**2,adaptive=False,nb_of_points=500,line_color='red',label='$sin(10x)/x^2$',show=False)

fig,ax = plt.subplots()
ax2 = ax.twinx()
move_sympyplot_to_axes(p1,is_twinx=False)
move_sympyplot_to_axes(p2,ax2,is_twinx=True)

ax2.tick_params(axis='y',colors='red')
ax2.set_ylabel('',color='red')
handles1,labels1 = ax.get_legend_handles_labels()
handles2,labels2 = ax2.get_legend_handles_labels()
plt.legend(handles1 + handles2,labels1 + labels2,loc='upper center')
plt.tight_layout()
plt.show()

example plot

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...