【问题标题】:Make several lines/plots grouped using matplotlib使用 matplotlib 将多条线/图分组
【发布时间】:2021-03-07 10:31:38
【问题描述】:

我已经坐在这里尝试完成这项工作超过 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()

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

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

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

    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()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-02
      • 2014-07-27
      • 2017-08-26
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      相关资源
      最近更新 更多