Maison >développement back-end >Tutoriel Python >Première introduction à Matplotlib

Première introduction à Matplotlib

巴扎黑
巴扎黑original
2017-06-23 11:08:472566parcourir

Exploration initiale de Matplotlib

L'exemple vient de ce livre : "Python Programming from Introduction to Practical Practice" [US] Eric Matthes

Utilisation du dessin pyplot, méthode d'importation généraleimport matplotlib.pyplot as plt

Les codes suivants sont exécutés dans Jupyter Notebook

Graphique linéaire

Regardons d'abord un exemple simple

import matplotlib.pyplot as plt

in_values = [1, 2 ,3, 4, 5]
squares = [1, 4, 9 ,16, 25]# 第一个参数是X轴输入,第二个参数是对应的Y轴输出;linewidth绘制线条的粗细plt.plot(in_values, squares, linewidth=4)# 标题、X轴、Y轴plt.title('Squares', fontsize=20)
plt.xlabel('Value', fontsize=12)
plt.ylabel('Square of the value', fontsize=12)# plt.tick_params(axis='both', labelsize=15)plt.show()

Comme le montre l'image ci-dessous, vous pouvez voir que l'axe des x est trop dense et comporte même des décimales.

Première introduction à Matplotlib

Si vous souhaitez que seules nos valeurs d'échantillon apparaissent sur l'axe des x, vous pouvez utiliser la fonction tick_params pour modifier la taille des graduations. Décommentez l'avant-dernière ligne du code ci-dessus pour obtenir l'image ci-dessous.

Première introduction à Matplotlib

plt.tick_params(axis='both', labelsize=15), où axis=both représente l'échelle qui affecte à la fois les axes x et y labelsize spécifie la taille de la police de l'échelle. plus grand et s'affiche à la même longueur. Moins il y a de points de coordonnées, et vice versa. Puisque labelsize est plus grand que la valeur par défaut, le nombre de points de coordonnées affichés sur les axes x et y devient plus petit. Plus conforme à cet exemple.

Nuage de points

Toujours l'exemple carré ci-dessus. Cette fois, tracé à l'aide d'un nuage de points.

in_values = [1, 2 ,3, 4, 5]
squares = [1, 4, 9 ,16, 25]# s参数为点的大小plt.scatter(in_values, squares, s=80)
plt.title('Squares', fontsize=20)
plt.xlabel('Value', fontsize=12)
plt.ylabel('Square of the value', fontsize=12)
plt.tick_params(axis='both', labelsize=15)
plt.show()

Comme vous pouvez le voir, je viens de remplacer plt.plot par plt.scatter, et le reste du code est fondamentalement inchangé.

Première introduction à Matplotlib

S'il y a de nombreux points d'entrée et de sortie, des compréhensions de liste peuvent être utilisées. Parallèlement, vous pouvez préciser la couleur des points et la couleur du contour des points. La couleur du point par défaut est le bleu et le contour est noir.

x_values = list(range(1, 100))
y_values = [x**2 for x in x_values]# c参数指定点的颜色,轮廓的颜色不进行设置(none)plt.scatter(x_values, y_values, c='red', edgecolors='none' ,s=5)# x、y轴的坐标范围,注意提供一个列表,前两个是x轴的范围,后两个是y轴的范围plt.axis([0, 110, 0, 11000])
plt.show()

La personnalisation des couleurs peut également utiliser le mode RVB et passer un tuple au paramètre c. Le tuple contient trois nombres compris entre [0, 1], représentant respectivement (R, V, B). Plus le nombre est proche de 0, plus la couleur est claire, et plus le nombre est proche de 1, plus la couleur est foncée. Par exemple, c=(0, 0 , 0.6) représente une couleur bleu clair.

C’est toujours une image carrée, donc j’ai la flemme d’écrire un titre.

Première introduction à Matplotlib

Carte de couleurs

Une carte de couleurs est généralement un dégradé d'une série de couleurs. En visualisation, le mappage des couleurs peut refléter les modèles de données. Par exemple, les couleurs plus claires ont des valeurs plus petites et les couleurs plus foncées ont des valeurs plus grandes.

Regardez un exemple très simple, un mappage basé sur la taille de la valeur des coordonnées de l'axe y.

x_values = list(range(1, 100))
y_values = [x**2 for x in x_values]# 颜色映射,按照y轴的值从浅到深,颜色采用蓝色plt.scatter(x_values, y_values, c=x_values, cmap=plt.cm.Blues, edgecolors='none' ,s=5)
plt.axis([0, 110, 0, 11000])# 取代show方法,保存图片到文件所在目录,bbox_inches='tight'可裁去多余的白边plt.savefig('squares_plot.png', bbox_inches='tight')

On peut voir que la couleur des points avec une petite valeur y est très claire et presque invisible ; à mesure que la valeur y augmente, la couleur devient de plus en plus foncée.

Première introduction à Matplotlib

Simulation de marche aléatoire

Écrivez d'abord un cours de marche aléatoire, le but est de choisir au hasard la direction pour avancer

from random import choicedef get_step():"""    获得移动的步长    """# 分别代表正半轴和负半轴direction = choice([1, -1])# 随机选择一个距离distance = choice([0, 1, 2, 3, 4])
    step = direction * distancereturn stepclass RandomWalk:"""    一个生成随机漫步数据的类    """# 默认漫步5000步def __init__(self, num_points=5000):self.num_points = num_pointsself.x_values = [0]self.y_values = [0]def fill_walk(self):"""        计算随机漫步包含的所有点        """while len(self.x_values) < self.num_points:
            x_step = get_step()
            y_step = get_step()# 没有位移,跳过不取if x_step == 0 and y_step == 0:continue# 计算下一个点的x和y, 第一次为都0,以前的位置 + 刚才的位移 = 现在的位置next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_stepself.x_values.append(next_x)self.y_values.append(next_y)

Commencez à dessiner les images générées par

import matplotlib.pyplot as plt


rw = RandomWalk()
rw.fill_walk()# figure的调用在plot或者scatter之前# plt.figure(dpi=300, figsize=(10, 6))# 这个列表包含了各点的漫步顺序,第一个元素将是漫步的起点,最后一个元素是漫步的终点point_numbers = list(range(rw.num_points))# 使用颜色映射绘制颜色深浅不同的点,浅色的是先漫步的,深色是后漫步的,因此可以反应漫步轨迹plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, s=1)# 突出起点plt.scatter(0, 0, c=&#39;green&#39;, edgecolors=&#39;none&#39;, s=50)# 突出终点plt.scatter(rw.x_values[-1], rw.y_values[-1], c=&#39;red&#39;, s=50)# 隐藏坐标轴plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)# 指定分辨率和图像大小,单位是英寸plt.show()

, des points densément emballés. De loin, ça a l'air plutôt bien. La verte est le point de départ de la balade, et la rouge est le point final de la balade.

Première introduction à Matplotlib

Mais l'image est un peu floue, alors décommentez la ligne ci-dessous rw.fill_walk(). Habituellement appelé avant de dessiner.

plt.figure(dpi=300, figsize=(10, 6)), dpi=300 est de 300 pixels/pouce. Cela doit être ajusté de manière appropriée pour obtenir une image claire. figsize=(10, 6)Le paramètre transmis est un tuple, qui représente la taille de la fenêtre de dessin, qui est la taille de l'image, en pouces.

Les images haute définition, ça vous plaît ?

Première introduction à Matplotlib

Traitement des données CSV

Nous devrons peut-être analyser les données fournies par d'autres. Généralement, ce sont des fichiers sous deux formats : json et csv. Voici les données météorologiques sitka_weather_2014.csv, qui sont les données météorologiques de Sitka, États-Unis en 2014. Matplotlib est utilisé ici pour traiter les fichiers csv, et le traitement des fichiers json est placé dans pygal.

Téléchargez les données sitka_weather_2014.csv

La première ligne du fichier csv est généralement l'en-tête du tableau, et les données réelles commencent à partir de la deuxième ligne. Voyons d’abord quelles données contiennent l’en-tête du tableau.

import csv

filename = &#39;F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv&#39;with open(filename) as f:
    reader = csv.reader(f)# 只调用了一次next,得到第一行表头header_row = next(reader)for index, column_header in enumerate(header_row):print(index, column_header)

Imprimez comme suit

0 AKST
1 Max TemperatureF
2 Mean TemperatureF
3 Min TemperatureF
4 Max Dew PointF
5 MeanDew PointF
6 Min DewpointF
7 Max Humidity
8  Mean Humidity
9  Min Humidity
...

Nous sommes intéressés par les températures maximales et minimales et avons juste besoin d'obtenir les colonnes 1 et 3 feront l'affaire. De plus, les données de date se trouvent dans la colonne 1.

La prochaine étape n’est pas difficile. À partir de la deuxième ligne, placez la température la plus élevée dans la liste des hautes, la température la plus basse dans la liste des basses et la date dans la liste des dates. Nous voulons afficher la date sur l'axe des x et introduire le module datetime.

import csvimport matplotlib.pyplot as pltfrom datetime import datetime

filename = &#39;F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv&#39;with open(filename) as f:
    reader = csv.reader(f)# 只调用了一次next,得到第一行表头header_row = next(reader)# 第一列是最高气温,由于上面next读取过一行了,这里实际从第二行开始,也是数据开始的那行# reader只能读取一次,所以如下写法dates为空#     highs = [int(row[1]) for row in reader]#     dates= [row[0] for row in reader]dates, highs, lows = [], [], []for row in reader:# 捕获异常,防止出现数据为空的情况try:
            date = datetime.strptime(row[0], &#39;%Y-%m-%d&#39;)# 第1列最高气温,读取到是字符串,转为inthigh = int(row[1])# 第3列最低气温low = int(row[3])except ValueError:print(date, &#39;missing data&#39;)else:
            dates.append(date)
            highs.append(high)
            lows.append(low)# figure在plot之前调用fig = plt.figure(dpi=300, figsize=(10, 6))# 最高气温的折线图plt.plot(dates, highs, c=&#39;red&#39;)# 最低气温的折线图plt.plot(dates, lows, c=&#39;blue&#39;)# 在两个y值之间填充颜色,facecolor为填充的颜色,alpha参数可指定颜色透明度,0.1表示颜色很浅接近透明plt.fill_between(dates, highs, lows, facecolor=&#39;blue&#39;, alpha=0.1)
plt.title(&#39;Daily high and low temperatures - 2014&#39;, fontsize=20)
plt.xlabel(&#39;&#39;, fontsize=16)
plt.ylabel(&#39;Temperature(F)&#39;, fontsize=16)# x轴的日期调整为斜着显示fig.autofmt_xdate()
plt.tick_params(axis=&#39;both&#39;,labelsize=15)
plt.show()

Première introduction à Matplotlib

看以看出,7月到9月都很热,但是5月出现过非常高的气温!

上面的代码有一行date = datetime.strptime(row[0], '%Y-%m-%d')。注意%Y-%m-%d要和row[0]字符串的格式一致。举个例子

# 下面这句报错time data &#39;2017/6/23&#39; does not match format &#39;%Y-%m-%d&#39;print(datetime.strptime(&#39;2017/6/22&#39;, &#39;%Y-%m-%d&#39;)) 
print(datetime.strptime(&#39;2017-6-22&#39;, &#39;%Y-%m-%d&#39;))

%Y指的是四位的年份, %y是两位年份,%m是数字表示的月份,%d数字表示的月份中的一天。


by @sunhaiyu

2017.6.22

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn