目次
1. この記事の紹介
この記事では、python の matplotlib ライブラリに基づいて、ヒストグラム、棒グラフ、ヒストグラム、円グラフ、極グラフ、バブル チャート (散布図)、箱ひげ図などの基本的なグラフィックを描画します。しかし、パラメーターについてはそれほど難しくはありません。著者の能力は限られています。また、論文を書く際に最も一般的に使用されるものはわずかしかありません。読者が私を許してくれることを願っています。これらのタイプのダイアグラムの役割については、この記事で言及しますが、詳しくは説明しません。著者は、真の知識は実践から得られると信じており、それをたくさん使用すると、何を使用するかが自然にわかります。
この記事が読者の役に立てば幸いです。作者も日々勉強中ですので、間違いがありましたら、批判・訂正よろしくお願いします。今回インポートするライブラリは以下の通りです。
import matplotlib.pyplot as plt
import numpy as np
グラフィックを中国語でマークする場合は、次のコードをインポートする必要があります。その中で、SimHei は太字を意味し、特定のフォントを設定する必要がある場合は、他の情報を参照できます。
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
2.基本グラフィック
2.1 ヒストグラム
bar():ヒストグラムは、異なるカテゴリまたは異なる時間でのデータの違いを示します。基本的なパラメータは次のとおりです。
bar(x,y,width,bottom,align,hatch,color,lw,tick_label,edgecolor,label...)
バツ | x 軸上の列の座標は、一連の文字列にすることもできます |
y | 列の高さ、つまり y 軸の値も、表示される値として理解できます。フロート、リスト、および ndarray (numpy 配列) がサポートされています |
幅 | 列幅、デフォルトは 0.8 です。幅を設定すると、グループ化されたヒストグラムを描画できます |
下 | 下部、列のベースの高さ。デフォルトでは 0 から始まります。値が大きい場合は、より一貫したベースの高さを設定して違いを強調できます。 |
整列する | X 軸上の列の位置合わせは、中央と端に設定できます。中央が中央で、端が右です。左に配置したい場合は、幅を負の値に設定する必要があります。同時に数。 |
ハッチ | 列の塗りつぶし記号。/、|、-、+、x、o、O、.、*、\ (エスケープ文字として簡単) などを使用できます。 |
色 | 列の塗りつぶし色、文字列、固定値にすることができ、文字列配列も受け入れます |
lw | linewidth の省略形、列の境界線の幅、浮動小数点数。これに似たのがラインスタイル(略称:ls) |
tick_label | x軸のラベル、配列タイプを設定できます |
エッジカラー | 列の境界線の色。色を指定するか、配列を指定できます |
ラベル | 表示される凡例 (文字列) は、plt.legend 関数と一緒に使用する必要があります。ただし、設定された色が均一でない場合、またはグループ化されたヒストグラムに表示されている場合は、最初に表示される色のみが表示され、意味が付けられます。 |
2.1.1 通常のヒストグラム
carray と array の色は、塗りつぶしの色の省略形です。一意の色を設定する場合は、入力を完了する必要があります。
x = [1, 2, 3, 4, 5]
# x = list("ABCDE")
y = [2.3, 2.6, 3.7, 4.1, 4.7]
width = [0.8, 0.2, 0.3, 0.5, 0.1]
carray = ['r', 'g', 'b', 'c', 'm'] # 柱子填充颜色
earray = ['r', 'y', 'k', 'g', 'b'] # 边框颜色
linewidth = 0.2
tlabel = ["a", 'b', 'c', 'd', 'e']
plt.bar(x, y, width=width, align="center",
bottom=None,
lw=linewidth,
tick_label=tlabel,
color=carray,
edgecolor=earray,
hatch='+', # 柱子填充符号
label="zzzz")
plt.legend()
plt.show()
効果は次のとおりです。列部分には、塗りつぶされた記号も含まれていることがわかります。x 軸の値はカスタマイズ可能で、plt.xticks() で設定することもできます。
2.1.2 積み上げ縦棒グラフ
積み上げヒストグラムは、大きなカテゴリの下にある特定のサブカテゴリの割合を表示できます.matplotlob では、カバーする追加のヒストグラムを描画します. ただし、「大きなカテゴリが最初に来て、小さなカテゴリが後に来る」という順序に注意する必要があります。覆われるのを防ぎます。
x = [1, 2, 3, 4, 5]
y = [2.3, 2.6, 3.7, 4.1, 4.7]
y1 = [1, 1.5, 2.3, 1.8, 3.2]
width = [0.8, 0.2, 0.3, 0.5, 0.1]
carray = ['k', 'g', 'b', 'c', 'm']
earray = ['r', 'y', 'k', 'g', 'b']
linewidth = 0.2
tlabel = ["a", 'b', 'c', 'd', 'e']
plt.bar(x, y, width=width, align="center",
bottom=None,
lw=linewidth,
tick_label=tlabel,
color=carray,
edgecolor=earray,
hatch='/') # 柱子填充符号
plt.bar(x, y1, width, align="center",
lw=linewidth, hatch='\\')
plt.show()
その影響は次のとおりです. 場合によってはそのような明確な層別化が行われないことに注意してください. 考えられる理由としては, 2 つのヒストグラムの順序が間違っているか, y 軸の設定が間違っていて, 小さなギャップが生じていることが考えられます.これは、y 軸の範囲を変更することで解決できます。
2.1.3 グループ化されたヒストグラム
前述のように width を設定できますが、現時点では最初のパラメーター x を文字列にすることはできません。これは、浮動小数点数に文字列を加算できないためです。グループ化されたヒストグラムは、異なるカテゴリの異なるグループ比較を表示できます。たとえば、異なる年の異なる季節の消費者数の比較。
x = np.arange(5)
y = [6, 10, 4, 5, 1]
y1 = [2, 6, 3, 8, 5]
bar_width = 0.35
tick_label = [2016, 2017, 2018, 2019, 2020]
plt.bar(x, y, bar_width, color='c', align='center', label='A类', alpha=0.5)
plt.bar(x+bar_width, y1, bar_width,
color='b', align='center',
alpha=0.5, label="B类",
tick_label=tick_label) # 与堆积柱状图相比,在x轴方向加入数值
plt.xlabel("不同年度不同产品类别销售情况")
plt.ylabel("销售量")
plt.legend()
plt.show()
結果は次のとおりです。これは、x 軸上の 2 番目のヒストグラムの位置を変更することによって実際に達成されます。上記のパラメータ紹介には出てこないコード内に alpha パラメータがあるのがわかるかもしれません. **kwargs にあります. bar の **kwargs は Rectange 属性に属しています. ここではあまり説明しません. 、そして作者は何も言うことはありません明確にしますが、このアルファパラメーターは透明度を意味し、列の透明度を設定すると、基本的に任意のグラフィックス描画で使用できます。
2.2 棒グラフ
barh():基本的にヒストグラムと同じ効果で、異なるカテゴリ間のギャップを比較します。一部のシナリオでは、表示効果がヒストグラムよりも優れています。基本的なパラメータは次のとおりです。
barh(y,width,height,left,align,....
y | y 座標軸を表し、文字列シーケンスまたは int 配列を受け入れます。これはバーの x に相当します |
幅 | つまり、バーの幅と同じバーの幅 |
身長 | バーの高さと同じ |
左 | バーの下部に相当します。つまり、バーの初期位置を設定し、配列または int 型を受け入れます |
その他のパラメータは基本的に bar() 関数と同じなので、ここでは繰り返しません。
2.2.1 通常の棒グラフ
通常の棒グラフは、ヒストグラムを 90°回転させたものに相当します。
y = [2, 7, 4, 5, 6]
width = [2.3, 2.6, 3.7, 4.1, 4.7]
height = 0.2
carray = 'b'
earray = 'm'
tlabel = ['cc', 'mm', 'r', 'uu', 'pp'] # y轴上标签
plt.barh(y, width, height,
align='center',
tick_label=tlabel,
edgecolor=earray,
color=carray,
left=10)
plt.show()
2.2.2 複数の棒グラフ
複合棒グラフは、グループ化された縦棒グラフに対応します。注:複合棒グラフでも集合縦棒グラフでも、凡例を追加する必要があります
y = np.arange(5)
h = [6, 10, 4, 5, 1]
h1 = [2, 6, 3, 8, 5]
bar_width = 0.35
tick_label = [2016, 2017, 2018, 2019, 2020]
plt.barh(y, h, bar_width, color='c', align='center', label='A类', alpha=0.5)
plt.barh(y+bar_width, h1, bar_width,
color='b', align='center',
alpha=0.5, label="B类",
tick_label=tick_label) # 与堆积柱状图相比,在x轴方向加入数值
plt.xlabel("不同年度不同产品类别销售情况")
plt.ylabel("销售量")
plt.legend()
plt.show()
2.2.3 積み上げ棒グラフ
その名前については、正しいかどうかはわかりませんが、それは、大カテゴリの小カテゴリと中カテゴリの比較でもあります.異なるバーの描画順序にも注意する必要があります.グラフが上書きされないようにします。
y = np.arange(5)
h = [2.3, 2.6, 3.7, 4.1, 4.7]
h1 = [1, 1.5, 2.3, 1.8, 3.2]
width = 0.8
linewidth = 0.2
tlabel = [2017, 2018, 2019, 2020, 2021]
plt.barh(y, h, height=width, align="center",
lw=linewidth,
tick_label=tlabel,
color="blue",
label="粮食产量")
plt.barh(y, h1, height=width, align="center", color='red',
lw=linewidth, label="小麦产量")
plt.title("不同年度小麦产量占比")
plt.xlabel("产量/亿吨")
plt.legend()
plt.show()
効果は以下の通りです。lw と width については、通常、配列を設定するのではなく、値を設定するだけで、表示が非常に見にくくなります. 描画の目的は、データを直感的に表示することであり、カートを置かないでください.馬の前。
2.3 ヒストグラム
hist():ヒストグラムは、データの分布を示すために使用されます。
ヒストグラムとの違い:
(1) ヒストグラムはデータのサイズを比較するもので、ヒストグラムはデータの分布を示します。
(2) ヒストグラムの列が分離され、ヒストグラムが隣接しています。
(3) ヒストグラムの X 軸は基本的にカテゴリ データですが、ヒストグラムは量的データです。
一般的なパラメータは次のとおりです。
hist(x, bins=None, range=None, density=False,
cumulative=False, bottom=None, histtype='bar',
align='mid',rwidth=None, log=False,
color=None,label=None)
バツ | 整数値または配列シーケンス |
ビン | 整数またはシーケンス。整数の場合は列数、それ以外の場合は各列の範囲値 |
範囲 | ヒストグラムの x 軸の範囲を設定します。これにより、一部の外れ値を削除できます。形式は (xmin,xmax) です。 |
密度 | bool 型、True の場合、確率密度を表示します |
累積的な | boo型、Trueなら累積度数を計算する |
下 | bar および barh と同じ、初期位置に対応する配列または証明書 |
ヒストタイプ | ヒストグラムの種類。bar は最も一般的なことを意味し、barstacked は積み重ねられたヒストグラムを意味し、step は塗りつぶされていないヒストグラムを意味します。
stepfilled は塗りつぶされたヒストグラムを示します。これは bar とあまり変わらない
|
整列する | ポストポジション。left は列の中心がビンの左端にあることを意味し、mid は中央、right は右端にあることを意味します。 |
幅 | 整数値、ビンの幅に対する列の幅の比率 |
ログ | ブールクラス。x 軸を対数化し、次元を減らすかどうか |
color は色を設定し、label は列ラベルを設定し、alpha は透明度を設定します。
2.3.1 通常のヒストグラム
x = np.random.normal(size=1000)
plt.hist(x, bins=100, density=False,
histtype="bar", # 用于选择条形图的样式
align="mid",
alpha=0.6)
plt.show()
np.random.normal(size=1000) は、1000 個の標準正規分布乱数を生成することを意味します。
2.3.2 確率分布ヒストグラム
x = np.random.normal(size=1000)
plt.hist(x, bins=100, density=True,
histtype="bar", # 用于选择条形图的样式
align="mid",
alpha=0.6)
plt.show()
通常のヒストグラムとの最大の違いはy軸の目盛りで、通常のヒストグラムは度数、下図は確率を表しています。
2.4 円グラフ
pie():アイテム間の比率を 1 次元データに直感的に反映します。ただし、データに負の値やゼロの値がないことが必要です。次のように、円グラフで一般的に使用される多くのパラメーターがあります。
pie(x, explode=None, labels=None, colors=None,
autopct=None,pctdistance=0.6, shadow=False,
labeldistance=1.1,startangle=0, radius=1,
wedgeprops=None,textprops=None, center=(0, 0),
rotatelabels=False)
バツ | 一次元配列、各プレートのサイズ |
爆発する |
円の半径に対する各プレートのオフセット距離。値は小数です。
|
ラベル | 各プレートのラベル、一連の文字列 |
autopct | プレートシェアラベル。%d%%: 整数のパーセンテージ; %0.1f: 小数点以下 1 パーセント; %0.1f%%: 小数点以下の 1 パーセント; %0.2f%%: 小数点以下の 2 パーセント |
距離の割合 |
板块内标签与圆心的距离。浮点数
|
shadow | 饼图下是否有阴影,略微展现立体感 |
labeldistance
|
饼块外标签与圆心的距离
|
startangle
|
饼块起始角度。浮点数,默认为 0,即从 x 轴开始,角度逆时针旋转
|
radius
|
饼图半径。浮点数,默认为 1,若>1,需要设置好画布大小
|
wedgeprops
|
饼块属性。字典,可以设置饼块边框大小,填充颜色等
|
textpropss
|
标签的文本属性,字典,可以设置字体、字号、颜色等 |
center | 饼图中心坐标,包含两个浮点数元素的元组 |
rotatelabels
|
bool类型,饼块外标签是否按饼块角度旋转。 |
2.4.1 非分裂饼图(常规饼图)
x = [10, 30, 50, 20, 45]
colors = ['#377eb8', "#4daf4a", "#984ea3", "#ff7f00", "#e7c3b2"] # 颜色
labels = ['A', 'B', 'C', 'D', 'E']
plt.pie(x, colors=colors, labels=labels,
autopct='%0.1f%%',
startangle=45,
pctdistance=0.7,
labeldistance=1.2)
plt.show()
2.4.2 分列式饼图
labels = ['A类', 'B类', 'C类', 'D类', 'E类']
x = [0.35, 0.20, 0.15, 0.05, 0.25]
colors = ['r', 'g', 'b', 'c', 'm']
explode = [0.1, 0.2, 0.05, 0.1, 0.06] # 每个板块相对于饼原半径的偏移距离
wedgeprops = {'linewidth': 1, 'edgecolor': "black"}
plt.pie(x, explode, labels, colors,
pctdistance=0.6, # 板块内标签与圆心的距离
autopct='%0.2f%%', # 板块内的标签
shadow=True,
labeldistance=1.1, # 饼块外标签与圆心的距离
startangle=0.00, # 饼块的其实角度
radius=1, # 兵源半径
wedgeprops=wedgeprops, # 饼块的属性
textprops={'fontsize': 12, 'color': 'black', "font": 'Kaiti'},
center=(0, 0), # 饼原中心坐标
rotatelabels=False) # 饼块外标签是否按照饼块角度旋转
plt.show()
分裂饼图最主要的参数即为explode。分裂饼图可以突出某一项所占比例,使得用户第一眼可以聚焦到想看到的地方。
2.4.3 环形图
在matplotlib中,环形图的原理即在一个圆中减去一个小圆,即用和背景颜色相同的单位圆覆盖住中间位置。
x = [15, 20, 17, 25]
explode = (0, 0.1, 0, 0)
label = ['a', 'b', 'c', 'd']
x_0 = [1, 0, 0, 0]
plt.pie(x, explode,
labels=label,
autopct="%3.1f%%",
startangle=90,
shadow=True)
plt.pie(x_0, radius=0.5, colors='w')
plt.axis('equal')
plt.show()
环形图要显示好标签,需要设置标签距离圆心的位置,确保足够美观。单位圆即只有一类,其余类没有,或者为0。
2.5 散点图
scatter():也称为气泡图。散点图可以展示两组数据中的关系,或者分析一种趋势,和折线图的作用有点类似。基本参数如下:
scatter(x, y, s=None, c=None, marker=None,
norm=None, vmin=None, vmax=None, alpha=None,
linewidths=None,edgecolors=None)
x,y | 对应二维坐标轴上的坐标,分别对应x轴、y轴 |
s |
指定图点的大小,默认 20
|
c
|
指定散点图的颜色,默认为蓝色
|
marker
|
指定散点的形状,默认为空心圆。可以设置:. , o v ^ > < * | _ + x d
|
norm |
设置数据亮度,范围0-1,使用该参数时仍需要参数 c
|
linewidths
|
设置散点边界线的宽度
|
edgecolor
|
设置散点边界线的颜色
|
vmin,vmax
|
亮度设置,与 norm 类似,如果使用 norm 参数,此参数无效
|
alpha即设置散点的透明度。示例如下:
x = np.random.randn(1000) # 返回1000个样本服从标准正态的数
y = np.random.randn(1000)
plt.scatter(x, y,
s=20, # 指定点的大小,若传入一维数组,则表示每个点的大小
c='g',
marker='o', # 指定散点形状
vmin=0, vmax=20,
alpha=0.5,
linewidths=1,
edgecolors='c')
plt.show()
2.5 极线图(雷达图)
polar():雷达图可以很好的对比不同个体在各个指标上的差异。也可以体现个体在各个方面的平衡。常用参数如下:
polar(thera,r,marker,linestyle,linewidth,color,ms...)
thera | 每个标记所在射线于极径的角度 |
r | 标记点到原点的距离 |
marker | 标记点样式,有 . , o v ^ > < * | + _ x d |
linestyle | 线的样式,-,--,-.,: |
linewidth | 浮点数,线的宽度 |
color | 线的颜色 |
ms | 标记点的大小 |
2.5.1 普通极线图
angles = np.linspace(0, 2*np.pi, 6)
r = np.random.randint(1, 10, 6)
plt.polar(angles, r)
plt.show()
np.linspace表示从0~2Π均匀分成6个数,random.randint(1,10,6)表示在1-10中选6个数,普通极线图是没有闭合的。效果如下。
2.5.2 雷达图
区别于普通的极线图,雷达图是闭合的。若要在极坐标上添加标签,需要使用此函数:plt.thetagrids()。
angles = np.linspace(0, 2*np.pi, 6)
labels = ['能力A', '能力B', "能力C", "能力D", "能力E", "能力F"]
r = np.random.randint(1, 10, 6)
r = np.append(r, r[0])
angles = np.append(angles, angles[0])
plt.polar(angles, r)
plt.thetagrids(angles=(np.linspace(0, 360, 6)), labels=labels, fontsize=15)
plt.show()
(注:有时候angles即角度用0到2的方法会导致绘制出来的图像一条直线,可以换成0到360)
想让极线图闭合,在matplotlib中,即在r中添加最初的位置,角度也要加上去。thetagrids的第一个参数是角度,第二个是标签。
若想要中间有填充效果,可以使用fill函数进行添加。
函数为:plt.fill(thera,r,color,alpha) ,效果如下:
angles = np.linspace(0, 2*np.pi, 6)
labels = ['能力A', '能力B', "能力C", "能力D", "能力E", "能力F"]
r = np.random.randint(1, 10, 6)
r = np.append(r, r[0])
angles = np.append(angles, angles[0])
plt.polar(angles, r, marker='*', lw=1, ls='--', ms=10, color='r')
plt.thetagrids(angles=(np.linspace(0, 360, 6)), labels=labels, fontsize=15)
plt.fill(angles, r, color='r', alpha=0.25)
plt.show()
2.5.3 复式雷达图
其实就是多个对象之间不同能力的对比,相比较分组柱状图,更加直观。
angles = np.linspace(0, 2*np.pi, 6)
labels = ['能力A', '能力B', "能力C", "能力D", "能力E", "能力F"]
r = np.random.randint(1, 10, 6)
r = np.append(r, r[0])
r1 = np.random.randint(1, 10, 6)
r1 = np.append(r1, r1[0])
angles = np.append(angles, angles[0])
plt.polar(angles, r, marker='*', lw=1, ls='--', ms=10, color='r', label="A")
plt.thetagrids(angles=(np.linspace(0, 360, 6)), labels=labels, fontsize=15)
plt.fill(angles, r, color='r', alpha=0.25)
plt.polar(angles, r1, marker='*', lw=1, ls='--', ms=10, color='g', label="B")
plt.fill(angles, r1, color='m', alpha=0.25)
plt.legend()
plt.show()
2.6 箱线图
boxplot():可以展示一组数据的分散情况,直方图虽然也能查看分散情况,但不够明显。参数如下:
boxplot(x, notch=None, sym=None, vert=None, whis=None,
positions=None, widths=None, patch_artist=None,
bootstrap=None, usermedians=None, conf_intervals=None,
meanline=None, showmeans=None, showcaps=None, showbox=None,
showfliers=None, boxprops=None, labels=None, flierprops=None,
medianprops=None, meanprops=None, capprops=None,
whiskerprops=None)
x | 指定数据,可以是一维数组,也可以是多维,即绘制多个图 |
notch |
bool类型,是否凹口的形式展示箱线图,默认非凹口
|
sym
|
指定异常点的形状,默认为+号显示
|
vert
|
bool类型,是否需要将箱线图垂直摆放,默认垂直拜访
|
whis
|
指定上下须与上下四分位的距离,默认为 1.5 倍的四分位差
|
positions
|
指定箱线图的位置
|
widths
|
指定箱线图的宽度,默认为 0.5
|
patch_artist
|
是否填充箱体的颜色
|
meanline
|
bool类型,是否用线的形式表示均值,默认用点来表示
|
showcaps
|
bool类型,是否显示箱线图顶端和末端的两条线,默认显示
|
showmeans
|
是否显示均值,默认不显示
|
showbox
|
bool类型,
是否显示箱线图的箱体,默认显示
|
showfliers
|
bool类型,
是否显示异常值,默认显示
|
boxprops
|
设置箱体的属性,如边框颜色,填充色等
|
labels
|
为箱线图添加标签,类似于图例的作用
|
filerprops
|
设置异常值的属性,如异常点的形状、大小、填充色等
|
medianprops
|
设置中位数的属性,如线的类型、粗细等
|
meanprops
|
设置均值的属性,如点的大小、颜色等
|
capprops
|
设置箱线图顶端和末端线条的属性,如颜色、粗细等
|
whiskerprops
|
设置须的属性,如颜色、如粗细、线的类型等
|
乍一看,箱线图的参数特别多,但是基本使用,只需要把x输入即可,其他都是特殊情况下的定制。
如何看箱线图?以上图为例,最上方和最下方的两条线是上下限。箱体上下的两条箱线即对应四分位数(y轴看是对应2和7),中间黄色的线即为均值。
x = np.arange(10)
plt.boxplot(x,
sym='o',
vert=None, # 是否将箱线图垂直摆放
widths=0.8, # 设置箱线图宽度
patch_artist='g', # 是否填充箱体颜色
showmeans=True,
meanprops={'marker': 'o', 'markerfacecolor': 'red', 'markersize': 5})
plt.show()
如果要在一张图上画多个箱线图,输入的x是多维数据即可。图中meanprops的参数也可以类似地用在其他参数上。
x = np.arange(10)
y = np.arange(3, 12)
plt.boxplot([x, y],
sym='o',
vert=None, # 是否将箱线图垂直摆放
widths=0.8, # 设置箱线图宽度
patch_artist='g', # 是否填充箱体颜色
showmeans=True,
meanprops={'marker': 'o', 'markerfacecolor': 'red', 'markersize': 5})
plt.show()
三、 总结
作者认为,常用的图就这些,无论是在学习还是在工作上,这些只是基本的图形。如果需要美化,可以结合上一篇文章Python可视化——matplotlib.pyplot绘图的基本参数详解。以及通过更加丰富的色彩进行展示。当然数据才是最重要的,作图的目的是为了更加直观的看清楚数据的情况。
如有写错或者不明白的地方,可以在评论区或者私信作者,欢迎各位读者批评指正。创作不易,可以的话,点赞、关注、收藏!!!