Maison  >  Article  >  développement back-end  >  Remplissage des couleurs et des lignes graphiques dans Matplotlib

Remplissage des couleurs et des lignes graphiques dans Matplotlib

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼avant
2019-06-04 16:31:404505parcourir

Matplotlib est une bibliothèque de traçage 2D Python qui peut produire des graphiques de qualité publication dans une variété de formats papier et d'environnements interactifs sur une variété de plates-formes.

Remplissage des couleurs et des lignes graphiques dans Matplotlib

Dans le dernier tutoriel de visualisation de données Matplotlib, nous présenterons comment créer des graphiques empilés et des diagrammes circulaires. Ce que je vous apporte aujourd'hui, c'est le remplissage de couleurs et de lignes graphiques.


Couleur

Le premier changement que nous souhaitons apporter est de changer plt.title en variable stock .

plt.title(stock)

Maintenant, présentons comment changer la couleur de l'étiquette. Nous pouvons le faire en modifiant notre objet axe :

ax1.xaxis.label.set_color('c')
ax1.yaxis.label.set_color('r')

Si nous exécutons ceci, nous verrons que les étiquettes changent de couleur, comme dans les mots.

Ensuite, nous pouvons spécifier des numéros spécifiques pour les axes à afficher, plutôt qu'une sélection automatique comme celle-ci :

ax1.set_yticks([0,25,50,75])

Ensuite, je souhaite introduire le remplissage. Ce que fill fait, c'est remplir la couleur entre la variable et une valeur de votre choix. Par exemple, on peut faire ceci :

ax1.fill_between(date, 0, closep)

Donc voilà, notre code est :

import matplotlib.pyplot as plt
import numpy as np
import urllib
import datetime as dt
import matplotlib.dates as mdates

def bytespdate2num(fmt, encoding='utf-8'):
    strconverter = mdates.strpdate2num(fmt)
    def bytesconverter(b):
        s = b.decode(encoding)
        return strconverter(s)
    return bytesconverter


def graph_data(stock):

    fig = plt.figure()
    ax1 = plt.subplot2grid((1,1), (0,0))

    stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=10y/csv'
    source_code = urllib.request.urlopen(stock_price_url).read().decode()
    stock_data = []
    split_source = source_code.split('\n')
    for line in split_source:
        split_line = line.split(',')
        if len(split_line) == 6:
            if 'values' not in line and 'labels' not in line:
                stock_data.append(line)


    date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
                                                          delimiter=',',
                                                          unpack=True,
                                                          converters={0: bytespdate2num('%Y%m%d')})

    ax1.fill_between(date, 0, closep)

    for label in ax1.xaxis.get_ticklabels():
        label.set_rotation(45)
    ax1.grid(True)#, color='g', linestyle='-', linewidth=5)
    ax1.xaxis.label.set_color('c')
    ax1.yaxis.label.set_color('r')
    ax1.set_yticks([0,25,50,75])

    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.title(stock)
    plt.legend()
    plt.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
    plt.show()


graph_data('EBAY')

Le résultat est :

Remplissage des couleurs et des lignes graphiques dans Matplotlib

Le rempli 1 Le problème est que nous pourrions finir par tout couvrir. Nous pouvons le résoudre avec transparence :

ax1.fill_between(date, 0, closep)

Maintenant, introduisons le remplissage conditionnel. Supposons que la position de départ sur le graphique soit celle où nous commençons à acheter sur eBay. Ici, si le prix est inférieur à ce prix, nous pouvons augmenter jusqu'au prix initial, puis s'il dépasse le prix initial, nous pouvons diminuer. On pourrait faire ceci :

ax1.fill_between(date, closep[0], closep)

générerait :

Remplissage des couleurs et des lignes graphiques dans Matplotlib

Si on voulait montrer le gain/perte avec des remplissages rouges et verts par rapport au prix d'origine, le remplissage vert est pour la hausse (remarque : la couleur des marchés boursiers étrangers est opposée à celle du marché national), le remplissage rouge est pour la baisse ? aucun problème! Nous pouvons ajouter un paramètre Where comme celui-ci :

ax1.fill_between(date, closep, closep[0],where=(closep > closep[0]), facecolor='g', alpha=0.5)

Ici, nous remplissons la zone entre le prix actuel et le prix d'origine, où le prix actuel est supérieur au prix d'origine. On lui donne une couleur de premier plan vert car il s'agit d'une montée, et on utilise une légère transparence.

Lignes

Nous ne pouvons toujours pas appliquer d'étiquettes aux données polygonales (comme les remplissages), mais nous pouvons implémenter des lignes vides comme avant, nous pouvons donc :

ax1.plot([],[],linewidth=5, label='loss', color='r',alpha=0.5)
ax1.plot([],[],linewidth=5, label='gain', color='g',alpha=0.5)
ax1.fill_between(date, closep, closep[0],where=(closep > closep[0]), facecolor='g', alpha=0.5)
ax1.fill_between(date, closep, closep[0],where=(closep < closep[0]), facecolor='r', alpha=0.5)

Cela nous donne du remplissage, ainsi que des lignes vides pour la gestion des étiquettes, que nous comptons afficher dans la légende. Le code complet ici est :

import matplotlib.pyplot as plt
import numpy as npimport urllib
import datetime as dt
import matplotlib.dates as mdates

def bytespdate2num(fmt, encoding='utf-8'):
    strconverter = mdates.strpdate2num(fmt)    
    def bytesconverter(b):
        s = b.decode(encoding)        
        return strconverter(s)    
    
    return bytesconverter
def graph_data(stock):
    
    fig = plt.figure()
    ax1 = plt.subplot2grid((1,1), (0,0))
    
    stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=10y/csv'
    source_code = urllib.request.urlopen(stock_price_url).read().decode()
    stock_data = []
    split_source = source_code.split('\n')    
    for line in split_source:
        split_line = line.split(',')        
       if len(split_line) == 6:            
           if 'values' not in line and 'labels' not in line:
              stock_data.append(line)
    date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
                                        delimiter=',',
                                        unpack=True,
                                        converters={0: bytespdate2num('%Y%m%d')})
    ax1.plot_date(date, closep,'-', label='Price')
    ax1.plot([],[],linewidth=5, label='loss', color='r',alpha=0.5)
    ax1.plot([],[],linewidth=5, label='gain', color='g',alpha=0.5)
    ax1.fill_between(date, closep, closep[0],where=(closep > closep[0]), facecolor=&#39;g&#39;, alpha=0.5)
    ax1.fill_between(date, closep, closep[0],where=(closep < closep[0]), facecolor='r', alpha=0.5)    
    for label in ax1.xaxis.get_ticklabels():
       label.set_rotation(45)
    ax1.grid(True)#, color='g', linestyle='-', linewidth=5)
    ax1.xaxis.label.set_color('c')
    ax1.yaxis.label.set_color('r')
    ax1.set_yticks([0,25,50,75])
    
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.title(stock)
    plt.legend()
    plt.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
    plt.show()
graph_data('EBAY')

Maintenant, notre résultat est :

Remplissage des couleurs et des lignes graphiques dans Matplotlib

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer