ホームページ >バックエンド開発 >Python チュートリアル >Matplotlib データ視覚化の使用方法を学ぶ
データの表示、つまりデータの視覚化はデータ分析の 5 番目のステップです。ほとんどの人は数字よりもグラフィックに敏感です。データを適切に表示する方法を使用すると、問題やパターンをすばやく発見し、データの背後に隠された価値を見つけることができます。
Matplotlib は、Python で一般的に使用される 2D 描画ライブラリであり、データを簡単に視覚化し、美しいグラフを作成できます。 Matplotlib モジュールは非常に大きく、最も一般的に使用されるサブモジュールの 1 つは pyplot です。通常は次の方法でインポートします:
import matplotlib.pyplot as plt
プログラムで頻繁に使用されるため、この名前が付けられていますmatplotlib.pyplot. 多くの繰り返しコードを減らすエイリアス plt
#3.Matplotlib.pyplot の基本的な使い方pyplot での最も基本的な描画方法は、点で描画することです。 、各点の座標が与えられると、pyplot はこれらの点を座標系に描画し、これらの点を線で接続します。サイン関数を例として、pyplot を使用して画像を描画します。コード セグメント 1:
import numpy as np import matplotlib.pyplot as plt x = np.arange(0,2*np.pi,0.1) #生成一个0到2pi、步长为0.1的数组x y = np.sin(x) #将x的值传入正弦函数,得到对应的值存入数组y plt.plot(x,y) #传入plt.plot(),将x,y转换成对应坐标。 plt.show() #显示图像
上記のプログラムは、次の画像を描画します。
##注:各点間の間隔を小さくして画像を近づけるため、x のステップ サイズは 0.1 に選択されます。それ以外の場合、ステップサイズが大きすぎるとポリラインになります ステップサイズが 1 の場合、次の状況になります:
np.sin() メソッドに加えて、np in numpy.cos()、np.tan() などの三角関数を計算するメソッドもあります。上記のメソッドのうち、最も重要なのは plt.plot() メソッドです。plt.plot() メソッドは、x と y の任意の対数を受け取ることができます。元のサインなどのこれらの画像を 1 つの画像上に描画します。コサイン画像を画像に追加するには、次のように記述できます:
import numpy as np import matplotlib.pyplot as plt x = np.arange(0,2*np.pi,0.1) #生成一个0到2pi,步长为0.1的数组x y1 = np.sin(x) #将x的值传入正弦函数,得到对应的值存入数组y1 y2 = np.cos(x) #将x的值传入余弦函数,得到对应的值存入数组y1 plt.plot(x,y1,x,y2) #传入plt.plot(),将(x,y1)、(x,y2)转换成对应坐标。 plt.show() #显示图像上記のプログラムは同じ x を共有します。もちろん、新しい x を再定義することもできます。最終的な画像は次のとおりです:
コード セグメント 2 では、plt.plot() メソッドを 1 回使用して、2 つの数値を対応する座標に直接変換しています。もちろん、2 回呼び出すこともできます。 2 行のコードと上記の 7 行目のコードは同等です。
plt.plot(x,y1) plt.plot(x,y2)
x と y の各ペアには、線の色、ポイント ラベル、および線の種類を指定するオプションの書式設定パラメータがあります。
コード セグメント 3: import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,2*np.pi,0.1) #生成一个0到2pi,步长为0.1的数组x
y1 = np.sin(x) #将x的值传入正弦函数,得到对应的值存入数组y1
y2 = np.cos(x) #将x的值传入余弦函数,得到对应的值存入数组y1
plt.plot(x,y1,'ro--',x,y2,'b*-.') #将(x,y1)、(x,y2)转换成对应坐标,并选用格式化参数
plt.show() #显示图像
パラメータ「ro--」を例に挙げると、rは赤(赤)、oは座標点のドットマーク、--は3つの部分に分かれています。点線。
'ro--' 一般的に、線は点線、座標点は点でマークされます。フォーマット パラメータのこれら 3 つの部分はすべてオプションです。つまり、部分的に渡すことも可能であり、順序の要件はありません。
3. データ表示
3.1 表示方法の選択方法
データ分析を通じて意思決定を行うため、適切なチャートを使用する データを正確に表すことが重要です。実際に使用するチャートは数十種類あり、データ表示の目的に応じて「傾向」「比較」「構成」「分布」「連結」の5種類に分類されます。データが時間の経過とともにどのように変化するかに関する最も一般的な時系列関係、トレンド内のアイコン年、月、日の変化の傾向を直感的に反映し、増加、減少、上下変動、または基本的に変化がないことを把握できます。最も一般的なのは、時間の経過に伴う指標の傾向をうまく表現できる折れ線グラフです。
逆分析対象が「シェア」や「割合」などの場合、全体としての各部分の割合に主に着目します。関係を示すグラフの一種で、最も一般的なのは円グラフです。
特定のディメンションの順序を表示し、特定のディメンション間の比較が類似しているか、「より大きい」か「より小さい」かを分析できます。 , たとえば、男の子と女の子の身長差を分析します。
######分布: ###たとえば、地理的位置データに基づいて、データ セットの頻度と分布を重視する場合は、マップを使用してさまざまな分布特性を表示します。より一般的に使用されるグラフには、マップ、ヒストグラム、散布図などがあります。 ###联系:主要查看两个变量之间是否表达出我们所要证明的相关关系,比如预期销售额可能随着优惠折扣的增长而增长,常用于表打“与......有关”、“随......而增长”、“随......而不同”等维度的关系。
在进行数据可视化时,要先明确分析的目标,再来选择五种合适的分类,最后选择某个分类里合适的图表类型。
其实在前面已经用过折线图了,就是使用 plot.plot() 方法。之前我们传入的时x和y坐标点,而折线图的 x 和 y 分别是时间点和对应的数据,下面以两个商品的销量走势为例:
import numpy as np import matplotlib.pyplot as plt x = ['周一','周二','周三','周四','周五','周六','周日'] y1 = [61,42,52,72,86,91,73] y2 = [23,26,67,38,46,55,33] #传入label参数 plt.rcParams['font.family'] = ['SimHei'] #设置字体防止乱码 plt.plot(x, y1, label='商品A') #增加折线图例“商品A” plt.plot(x, y2, label='商品B') #增加折线图例“商品B” #设置x轴标签 plt.xlabel('时间') plt.ylabel('销量') #设置图表标题 plt.title('商品销量对比图') #显示图例、图像 plt.legend(loc='best') #显示图例,并设置在“最佳位置” plt.show()
得到的图像如下图所示:
因为上图中有中文,所以通过 plt.rcParams['font.family'] = ['SimHei'] 来设置中文字体来防止乱码,如果想设置其他字体只需将 SimHei(黑体)替换成相应的名称即可。通过一下代码获得,自己编译器所在环境安装的字体:
import matplotlib.font_manager as fm for font in fm.fontManager.ttflist: print(font.name)
图例位置是一个可选参数,默认 matplotlib 会自动选择合适位置,也可以指定其他位置。
具体的如下表所示:
plt.legend() 方法的 loc 参数选择 参数含义参数含义best最佳位置center居中upper right右上角center right靠右居中upper left左上角center left靠左居中lower left左下角lower center靠下居中lower right右下角upper center靠上居中
柱状图描述的是分类数据,展示的是每一类的数量。柱状图分为很多种,有普通柱状图、堆叠柱状图、分组柱状图等。
普通柱状图调用 plt.bar() 方式实现。我们至少需要传入两个参数,第一个参数是 x 轴上刻度的标签序列(列表、元组、数组等),第二个参数用于指定每个柱子的高度,也就是具体的数据。下面以一个班级体育课选课的情况为例:
import matplotlib.font_manager as fm for font in fm.fontManager.ttflist: print(font.name)
得到如下图像:
plt.bar() 前两个参数是必选的,当然还有一些可选参数,常用的有 width 和 color ,分别是用于设置柱子的宽度(默认0.8)和颜色。比如我们将柱子宽度改成0.6,将柱子的颜色设成好看的天蓝色只需将 plt.bar() 改为 plt.bar(names, nums, width=0.6, color='skyblue') 即可。之前在折线图部分用到的 plt.xlabel() 、plt.ylabel() 、plt.title() 和 plt.legend() 方法都是通用方法,并不局限于一种图表,所有的图表都适用。
柱状图能直观地展现出不同数据上的差异,但有时候我们需要进一步分析数据的分布,比如每门选修课的男女比例,这时就需要用到堆叠柱状图。
下面就是进一步分析每一门选修课中男女比例为例编写程序:
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['SimHei'] #设置字体防止乱码 name = ['乒乓球','羽毛球','网球'] nums_boy = [16,5,11] nums_girl = [10,15,8] plt.bar(name, nums_boy, width=0.6, color='skyblue', label='男') plt.bar(name, nums_girl, bottom=nums_boy, width=0.6, color='pink', label='女') plt.legend() plt.show()
最终得到图像:
上面的代码和普通柱状图相比,多调用了一次,plt.bar() 方法,并传入了 bottom 参数,每调用一次 plt.bar() 方法都会画出对应的柱状图,而 bottom 参数作用就是控制柱状图低端的位置。我们将前一个柱状图的高度传进去,这样就形成了堆叠柱状图。而如果没有 bottom 参数,后面的图形会盖在原来的图形之上,
就像下面这样:
分组柱状图经常用于不同组间数据的比较,这些组都包含了相同分类的数据。
先来看一下效果图:
绘制上图的代码如下:
import numpy as np import matplotlib.pyplot as plt x = np.arange(3) width = 0.3 names = ['篮球', '羽毛球', '乒乓球'] nums_boy = [16, 5, 11] nums_girl = [10, 15, 8] plt.rcParams['font.family'] = ['SimHei'] #设置字体防止乱码 plt.bar(x - width / 2, nums_boy, width=width, color='skyblue', label='男') plt.bar(x + width / 2, nums_girl, width=width, color='pink', label='女') plt.xticks(x, names) plt.legend() plt.show()
这次的方法和之前有些不同,首先使用 np.arange(3) 方法创建了一个数组 x ,值为[0,1,2]。并定义了一个变量 width 用于指定柱子的宽度。在调用 plt.bar() 时,第一个参数不再是刻度线上的标签,而是对应的刻度。以[0,1,2]为基准,分别加上或减去柱子的宽度得到[-0.15,0.85,1,85]和[0.15,1.15,2.15],这些刻度将分别作为两组柱子的中点,并且柱子的宽度为0.3。
因为传入的是刻度,而不是刻度的标签。所以调用 plt.xticks() 方法来将 x 轴上刻度改为对应的标签,该方法第一个参数时要改的刻度序列,第二个参数时与之对于的标签序列。同理,使用plt.yticks() 方法来更改y轴上刻度的标签。
饼图广泛地应用在各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于100%。
饼图的绘制很简单,只需要传入数据和对于的标签给 plt.pie() 方法即可。以2018年国内生产总值(GDP)三大产业的占比为例,可以画出这样的饼图:
绘制上图的代码如下:
import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['SimHei'] #设置字体防止乱码 data = [64745.2, 364835.2, 489700.8] labels = ['第一产业', '第二产业', '第三产业'] explode = (0.1, 0, 0) plt.pie(data, explode=explode, labels=labels,autopct='%0.1f%%') plt.show()
plt.pie() 方法的第一个参数是绘图需要的数据;参数 explode 是可选参数,用于突出显示某一区块,默认数值都是0,数值越大,区块抽离越明显;参数 lables 是数据对应的标签;参数 autopct 则给饼图自动添加百分比显示。
参数 autopct 的格式用到了字符串格式化输出的知识,代码中 '%0.1f%%' 可以分成两部分。一部分是 %0.1f 表示保留一位小数,同理 %0.2f 表示保留两位小数;另一部分是 %% ,它表示输出一个 %,因为% 在字符串格式化输出中有特殊的含义,所以想要输出 % 就得写成 %% 。所以,'%0.1f%%' 的含义是保留一位小数的百分数,例如:66.6%。
Matplotlib 提供了子图的概念,通过使用子图,可以在一张图里绘制多个图表。在 matplotlib 中,调用 plt.subplot() 方法来添加子图。plt.subplot() 方法的前两个参数分别是子图的行数和列数,第三个参数是子图的序号(从1开始)。
ax1 = plt.subplot(2, 2, 1) ax2 = plt.subplot(2, 2, 2) ax3 = plt.subplot(2, 2, 3) ax4 = plt.subplot(2, 2, 4)
plt.subplot(2,2,1) 的作用是生成一个两行两列的子图,并选择其中序号为1的子图,所以上面四行代码将一张图分成了4个子图,并用1、2、3、4来选择对应的子图。
我们也可以绘制不规则的子图,比如上面两张子图,下面一张子图。
方法如下:
ax1 = plt.subplot(2, 2, 1) ax2 = plt.subplot(2, 2, 2) ax3 = plt.subplot(2, 1, 2)
之所以第三行代码是 plt.subplot(2, 1, 2) ,因为子图序号是独立的,与之前创建的子图没有关系。plt.subplot(2, 2, 1) 选择并展示了2*2的子图中的第一个。plt.subplot(2, 2, 2) 选择并展示了2*2的子图中的第二个,它们两个合起来占了2*2子图的第一行。而 plt.subplot(2, 1, 2) 则是生成了两行一列的子图,并选择了第二行。即占满第二行的子图,正好填补了之前2*2子图第二行剩下的空间,因此生成的图表是这样的:
图表的框架画好了,就可以往里面填充图像了,之前调用的是 plt 上的方法绘图,只要将其改成 plt.subplot() 方法的返回值上调用相应的方法绘图即可。
举个栗子,下面是在一张图上绘制了 sin、cos 和 tan 三个函数的图像的代码:
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['SimHei'] #设置字体防止乱码 x = np.arange(0, 2 * np.pi, 0.1) plt.suptitle('三角函数可视化') ax1 = plt.subplot(2,2,1) ax1.set_title('sin函数') y1 = np.sin(x) ax1.plot(x,y1) ax2 = plt.subplot(2,2,2) ax2.set_title('cos函数') y2 = np.cos(x) ax2.plot(x,y2) ax3 = plt.subplot(2,1,2) ax3.set_title('tan函数') y3 = np.tan(x) ax3.plot(x,y3) plt.show()
得到的图像是:
上面程序中,使用 set_title() 方法为每个子图设置单独的标题。需要注意的是,如果想要给带有子图的图表设置总的标题的话,不是使用的 plt.titie() 方法,而是通过 plt.suptitile() 方法来设置带有子图的图表标题。
以上がMatplotlib データ視覚化の使用方法を学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。