Python Matplotlib-polyfit趋势线似乎重叠,看起来模糊/不清楚

Python Matplotlib-polyfit趋势线似乎重叠,看起来模糊/不清楚,python,matplotlib,trendline,Python,Matplotlib,Trendline,我试图为我掌握的一些数据绘制一些趋势线。问题是,若我使用虚线或虚线样式,它看起来很模糊,而且似乎自身重叠 不知道为什么,但线条看起来也没有进行抗锯齿处理——它们看起来参差不齐。尝试在Excel中生成完全相同的图形会得到清晰的线条 使用其他线条样式没有帮助;也不会通过添加破折号=(1,5)或类似符号来增加间距。即使增加打印大小或更改线宽,它仍然重叠 代码如下: 从matplotlib导入pyplot作为plt 将matplotlib.ticker作为mtick导入 进口numpy 从scipy导入

我试图为我掌握的一些数据绘制一些趋势线。问题是,若我使用虚线或虚线样式,它看起来很模糊,而且似乎自身重叠

不知道为什么,但线条看起来也没有进行抗锯齿处理——它们看起来参差不齐。尝试在Excel中生成完全相同的图形会得到清晰的线条

使用其他线条样式没有帮助;也不会通过添加破折号=(1,5)或类似符号来增加间距。即使增加打印大小或更改线宽,它仍然重叠

代码如下:

从matplotlib导入pyplot作为plt
将matplotlib.ticker作为mtick导入
进口numpy
从scipy导入统计信息
氡=[49.6,61.7,58.7,64.1,59.4,64.6,65.4,65.3,65.5,66.0,50.5,64.8,71.9,,
71.9,60.4,54.4,50.9,58.1,52.6,55.6,56.6,41.6,43.0,33.0,41.5,53.5,52.2,45.1,
46.8,63.0,73.8,61.3,44.4,39.3,38.2,45.4,39.9,36.3,41.0,38.5,35.4,40.2,11.3,
34.7,24.2,24.5,32.1,26.3,23.6,32.1,27.5,39.0,24.9,22.0,18.2,23.0,21.1,15.4,
13.9,10.2,26.4,18.2,16.6]
tout=[-2.57,-3.31,-0.63,-0.39,-1.64,-7.62,-1.90,-0.35,-4.88,-1.27,
-0.23,-6.99,-2.87,-12.27,-11.90,-9.42,-4.10,-3.15,0.81,3.87,-11.41,-9.47,
0.25,-6.81,-13.70,-16.41,-14.14,-9.70,-10.32,-21.83,-26.55,-16.88,-6.85,
4.03,-7.89,-6.53,-3.96,-6.09,-3.15,-0.51,-2.62,8.13,2.08,0.58,1.99,-6.64,
-12.13,-4.95,-2.99,-4.81,-0.88,0.28,-1.44,1.92,3.73,0.21,1.11,6.83,13.31,
7.04,1.46,1.78]
#数据的开始和结束索引
a=[0,21,42]
b=[20,41,62]
n=0#只是一个计数器
#设置字体系列
hfont={'family':'Arial'}
plt.rcParams.update({'font.family':'Arial','font.size':12})
#设置轴小刻度线
plt.axes().yaxis.set_minor_locator(mtick.MultipleLocator(4))
plt.axes().xaxis.set_minor_定位器(mtick.MultipleLocator(2))
plt.axes().yaxis.set_major_格式化程序(mtick.FormatStrFormatter('.0f%%'))
#配置轴标签
plt.xlabel(“室外温度”**hfont)
plt.ylabel(“散热器开启%”,**hfont)
#设置线条和标记类型及颜色
标记=['o','s','x']
marker_facecolor=['None','k','None']
名称=[“手动控制”、“强制计划”、“基于占用率”]
行=[':','-','-']
行距=[[1,5],[5,5],[0,0]]
透明度=[1,0.75,1]
对于i,j(a,b):
#得到x和y
x=numpy.array(tout[i:j])
y=numpy.array(radon[i:j])
#设置轴范围
plt.ylim(01100)
plt.xlim(-30,20)
#绘图数据
plt.绘图(x,y,标记[n],标记边缘宽度=0.75
,markeredgecolor='k',markerfacecolor=marker_facecolor[n],
alpha=透明度[n],label=名称[n])
#进行回归
z=numpy.polyfit(x,y,1)
p=numpy.poly1d(z)
#绘制趋势线
plt.plot(x,p(x),'k%s'%lines[n],线宽=0.85)
#增量计数器
n+=1
plt.图例(位置='右上')
支腿=plt.legend()
leg.get_frame().set_edgecolor('k'))
plt.savefig('tout_vs_radon.png',dpi=300)
plt.show()
以下是上述代码的结果: (抱歉,没有足够的声誉发布图像)


对于虚线或虚线样式,可以看到趋势线在中心重叠。我在Windows 10上使用matplotlib v3.0.3和Python v3.6.5。

关键是以排序方式绘制数组。否则,直线将前后跳跃并重叠

order = np.argsort(x)
plt.plot(x[order],p(x[order]), ..)
完整代码:

from matplotlib import pyplot as plt
import matplotlib.ticker as mtick
import numpy as np

radon = [49.6,61.7,58.7,64.1,59.4,64.6,65.4,65.3,65.5,66.0,50.5,64.8,71.9,
71.9,60.4,54.4,50.9,58.1,52.6,55.6,56.6,41.6,43.0,33.0,41.5,53.5,52.2,45.1,
46.8,63.0,73.8,61.3,44.4,39.3,38.2,45.4,39.9,36.3,41.0,38.5,35.4,40.2,11.3,
34.7,24.2,24.5,32.1,26.3,23.6,32.1,27.5,39.0,24.9,22.0,18.2,23.0,21.1,15.4,
13.9,10.2,26.4,18.2,16.6]

tout = [-2.57,-3.31,-0.63,-0.60,0.39,-1.64,-7.62,-1.90,-0.35,-4.88,-1.27,
-0.23,-6.99,-2.87,-12.27,-11.90,-9.42,-4.10,-3.15,0.81,3.87,-11.41,-9.47,
0.25,-6.81,-13.70,-16.41,-14.14,-9.70,-10.32,-21.83,-26.55,-16.88,-6.85,
4.03,-7.89,-6.53,-3.96,-6.09,-3.15,-0.51,-2.62,8.13,2.08,0.58,1.99,-6.64,
-12.13,-4.95,-2.99,-4.81,-0.88,0.28,-1.44,1.92,3.73,0.21,1.11,6.83,13.31,
7.04,1.46,1.78]

# start and end index for data
a = [0,21,42]
b = [20,41,62]

n = 0   # just a counter

# set font family
hfont = {'family':'Arial'}
plt.rcParams.update({'font.family': 'Arial', 'font.size':12})

# set axis minor tick marks
plt.gca().yaxis.set_minor_locator(mtick.MultipleLocator(4))
plt.gca().xaxis.set_minor_locator(mtick.MultipleLocator(2))
plt.gca().yaxis.set_major_formatter(mtick.FormatStrFormatter('%.0f%%'))

# config axis labels
plt.xlabel("Outdoor Temperature", **hfont)
plt.ylabel("Radiator on %", **hfont)

# set line and marker types and colors
marker = ['o', 's', 'x']
marker_facecolor = ['None', 'k', 'None']
names = ['Manual Control', 'Enforced Schedule', 'Occupancy-based']
lines = [':','--','-']
line_spacing = [[1, 5], [5, 5], [0, 0]]
transparency = [1, 0.75, 1]

for i,j in zip(a,b):
    # get x and y
    x = np.array(tout[i:j])
    y = np.array(radon[i:j])

    # set axis ranges
    plt.ylim(0, 100)
    plt.xlim(-30, 20)

    # plot data
    plt.plot(x, y, marker[n],markeredgewidth=0.75,
             markeredgecolor='k',markerfacecolor=marker_facecolor[n],
             alpha=transparency[n],label=names[n])

    # perform regressions
    z = np.polyfit(x, y, 1)
    p = np.poly1d(z)

    # plot trendline
    order = np.argsort(x)
    plt.plot(x[order],p(x[order]),'k%s' % lines[n], linewidth=0.85)

    # increment counter
    n+=1

plt.show()

关键是以排序的方式绘制数组。否则,直线将前后跳跃并重叠

order = np.argsort(x)
plt.plot(x[order],p(x[order]), ..)
完整代码:

from matplotlib import pyplot as plt
import matplotlib.ticker as mtick
import numpy as np

radon = [49.6,61.7,58.7,64.1,59.4,64.6,65.4,65.3,65.5,66.0,50.5,64.8,71.9,
71.9,60.4,54.4,50.9,58.1,52.6,55.6,56.6,41.6,43.0,33.0,41.5,53.5,52.2,45.1,
46.8,63.0,73.8,61.3,44.4,39.3,38.2,45.4,39.9,36.3,41.0,38.5,35.4,40.2,11.3,
34.7,24.2,24.5,32.1,26.3,23.6,32.1,27.5,39.0,24.9,22.0,18.2,23.0,21.1,15.4,
13.9,10.2,26.4,18.2,16.6]

tout = [-2.57,-3.31,-0.63,-0.60,0.39,-1.64,-7.62,-1.90,-0.35,-4.88,-1.27,
-0.23,-6.99,-2.87,-12.27,-11.90,-9.42,-4.10,-3.15,0.81,3.87,-11.41,-9.47,
0.25,-6.81,-13.70,-16.41,-14.14,-9.70,-10.32,-21.83,-26.55,-16.88,-6.85,
4.03,-7.89,-6.53,-3.96,-6.09,-3.15,-0.51,-2.62,8.13,2.08,0.58,1.99,-6.64,
-12.13,-4.95,-2.99,-4.81,-0.88,0.28,-1.44,1.92,3.73,0.21,1.11,6.83,13.31,
7.04,1.46,1.78]

# start and end index for data
a = [0,21,42]
b = [20,41,62]

n = 0   # just a counter

# set font family
hfont = {'family':'Arial'}
plt.rcParams.update({'font.family': 'Arial', 'font.size':12})

# set axis minor tick marks
plt.gca().yaxis.set_minor_locator(mtick.MultipleLocator(4))
plt.gca().xaxis.set_minor_locator(mtick.MultipleLocator(2))
plt.gca().yaxis.set_major_formatter(mtick.FormatStrFormatter('%.0f%%'))

# config axis labels
plt.xlabel("Outdoor Temperature", **hfont)
plt.ylabel("Radiator on %", **hfont)

# set line and marker types and colors
marker = ['o', 's', 'x']
marker_facecolor = ['None', 'k', 'None']
names = ['Manual Control', 'Enforced Schedule', 'Occupancy-based']
lines = [':','--','-']
line_spacing = [[1, 5], [5, 5], [0, 0]]
transparency = [1, 0.75, 1]

for i,j in zip(a,b):
    # get x and y
    x = np.array(tout[i:j])
    y = np.array(radon[i:j])

    # set axis ranges
    plt.ylim(0, 100)
    plt.xlim(-30, 20)

    # plot data
    plt.plot(x, y, marker[n],markeredgewidth=0.75,
             markeredgecolor='k',markerfacecolor=marker_facecolor[n],
             alpha=transparency[n],label=names[n])

    # perform regressions
    z = np.polyfit(x, y, 1)
    p = np.poly1d(z)

    # plot trendline
    order = np.argsort(x)
    plt.plot(x[order],p(x[order]),'k%s' % lines[n], linewidth=0.85)

    # increment counter
    n+=1

plt.show()