使用matplotlib将多条直线/绘图分组

2024-10-01 13:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在这里坐了3个多小时,试图让这项工作,但我不知道如何解决我的问题。我有一个项目,我有很多关于不同国家二氧化碳排放的数据,我应该把这些数据画出来。还应使用两种不同的方法对数据进行平滑处理,并绘制数据图。这使得每个国家有3条不同的线(一行原始数据,一行使用方法1进行平滑,一行使用方法2进行平滑)。这是我的问题。我想绘制5个国家的数据,这将产生15条不同的线,但我希望它们被分组/链接到各自的国家,这意味着它们应该以三个一组的方式绘制(这些组应该具有相同的颜色和标签/图例)。我不知道如何更好地表达我的问题

以下是我的全部代码,但问题在于“Del B”及以后:

import csv
import matplotlib.pyplot as plt

#smooth_a
def smooth_a(x, n):
    r=[]                                                  #Tom lista
    temp=[]                                               #Temporär lista
    
    for i in range(n):
        temp.insert(0, x[0])                              #Lägger in första elementet från listan x n gånger i temporära listans början
        temp.append(x[-1])                                #Lägger in sista elementet från lista x n gånger i temporära listans slut
        
    temp = temp[:n] + x + temp[-n:]                       #Lägger in hela lista x i mitten av den temporära listan
    
    i=0
    for element in temp[n:-n]:                            #Går på intervallet som enbart uppgörs av lista x i den temporära listan
        e=temp.index(element,n+i)                         #e=indexet elementet uppgör i den temporära listan
        a=sum(temp[e-n:e+n+1])/(2*n + 1)                  #Räknar ut medelvärdet med det givna intervallet n
        r.append(a)                                       #Lägger in medelvärdet i lista r
        i+=1                                              #Gör att "e" går till nästa index
        
    return r

#smooth_b
def smooth_b(x, n):
    r=[]                                                  #Tom lista
    temp=[]                                               #Temporär lista
    
    for i in range(2*n):
        temp.append("invalid")                            #Lägger in ett sträng element 2*n gånger i den temporära listan
        
    temp=temp[:n] + x + temp[-n:]                         #Lägger in hela lista x i mitten av den temporära listan
    
    i=0
    for element in temp[n:-n]:                            #Går på intervallet som enbart uppgörs av lista x i den temporära listan
        e=temp.index(element,n+i)                         #e=indexet elementet uppgör i den temporära listan
        low=0                                             #Låga intervallet
        high=0                                            #Höga intervallet
        while type(temp[e-n+low])==str:                   #Om låga intervallet blir "invalid" ska intervallet minskas från vänster
            low+=1
        while type(temp[e+n-high])==str:                  #Om höga intervallet blir "invalid" ska intervallet minskas från höger
            high+=1
        
        a=sum(temp[e-n+low:e+n+1-high])/(n-low+n-high+1)  #Räknar ut medelvärdet med det nya höga/låga intervallet
        r.append(a)
        i+=1                                              #Gör att "e" går till nästa index
        
    return r

#Del A
def load_csv(filename):                                                                    #skapar en funktion
    with open(filename, 'r') as file:                                                      #öppnar angivna filen i read-mode
        reader = csv.reader(file)                                                          #läser filen genom att sätta raderna till en lista av type = str                                                      
        next(reader)                                                                       #hoppar över första raden (rubrikerna)
        CO2_dict = {column[1].lower():list(map(float, column[3:])) for column in reader}   #lexikonbeskrivning som skapar ett lexikon där nyckeln är landskoden (i små bokstäver) och värdet är all data omvandlat till float.
        return CO2_dict
    
#Del B


CO2_dict=load_csv('CO2Emissions_filtered.csv')

country_list=['dnk', 'fin', 'isl', 'nor', 'swe']

values = []
for country in country_list:
    values.append(CO2_dict[country])

time = list(range(1960, 2015))
fig, ax = plt.subplots()

for country in values:
    smoothing_a=smooth_a(country,5)
    smoothing_b=smooth_b(country,5)

    ax.plot(time, smoothing_a, '-', linewidth=2)
    ax.plot(time, smoothing_b, '--', linewidth=2)
    ax.plot(time, country,':', linewidth=2)
    ax.legend(country_list)
    
ax.set(xlabel='Year', ylabel='CO2 Emissions [kt]', title='Yearly emissions of Co2 in the Nordic countries')
ax.grid()
plt.show()

我的情节是这样的: 1 但我希望它看起来像这样: 2


Tags: 数据inforaxcountrytemprasmooth
1条回答
网友
1楼 · 发布于 2024-10-01 13:31:16

您必须使用循环并根据相应的国家/地区固定每条曲线的颜色

color_list=["blue","orange","green","red","purple"]

for i in range(len(values)):
    smoothing_a=smooth_a(values[i],5)
    smoothing_b=smooth_b(values[i],5)

    ax.plot(time, smoothing_a, '-',color=color_list[i], linewidth=2)
    ax.plot(time, smoothing_b, ' ',color=color_list[i] , linewidth=2)
    ax.plot(time, values[i],':',color=color_list[i] , linewidth=2, label=country_list[i])

plt.legend()

相关问题 更多 >