为什么我在matplotlib中得到了两个图例?

1 投票
1 回答
784 浏览
提问于 2025-04-17 23:47

这是我的图:

在这里输入图片描述

这是我的代码:

#!/usr/bin/env python 
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad 

mu = 0 
def fermions_integrand(x):
    return np.sqrt(x)*((np.log(1+np.exp(-x+mu))) + (1/(np.exp(x-mu)+1))*(x-mu))
def s_fermions(mu):
    return quad(fermions_integrand, 0, np.inf)

def bosons_integrand(x):
    return np.sqrt(x)*((-np.log(1-np.exp(-x+mu))) + (1/(np.exp(x-mu)-1))*(x-mu))
def s_bosons(mu):
    return quad(bosons_integrand, 0, np.inf)


plt.figure(figsize=(8, 5))
plt.title('Fermions Vs Bosons')
plt.xlabel(r'$\mu$')
plt.ylabel('s/g')
plt.plot(np.linspace(-10,10), [s_fermions(mu) for mu in np.linspace(-10,10)], 'b-', lw=3, color='red', label='Fermions')
plt.plot(np.linspace(-10,10), [s_bosons(mu) for mu in np.linspace(-10,10)], 'b-', lw=3, color='blue', label='Bosons')
plt.legend()
plt.grid(True)
plt.show() 

我觉得代码很简单,但为什么我会得到两个图例呢?我该怎么解决这个问题?

进一步的信息:其实,我之前在另一个问题上用过这个绘图代码,当时没有问题(在Ubuntu上),但这次我刚换到OSX,不确定这是否和这个问题有关?

1 个回答

2

这个问题发生是因为 scipy.integrate.quad 这个函数返回的是估算的积分值和绝对误差的估算值,它们一起组成一个元组 (y, abserr)

接着,下面的两个列表

[s_fermions(mu) for mu in np.linspace(-10,10)]
[s_bosons(mu) for mu in np.linspace(-10,10)]

是值的对的列表,你同时在绘制被积函数和绝对误差(实际上在整个范围内,绝对误差是非常接近零的)。因为你同时绘制了两条线,所以图例中会有两个条目。

只需在 s_bosonss_fermions 的返回行后加上 [0],这样就不会绘制误差了。

撰写回答