如何解决次要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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。