matplotlib模塊


matplotlib模塊

一、導入方式

import matplotlib.pyplot as plt # 默認支持英文,不支持中文

二、作用

可視化分析

三、方法

中文轉英文的方法

from matplotlib.font_manager import FontProperties
font = FontProperties(fname='中文字體所在的路徑')

3.1 條形圖

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

# 修改背景為條紋
plt.style.use('ggplot')

classes = ['3班', '4班', '5班', '6班']

classes_index = range(len(classes))
print(list(classes_index))

student_amounts = [66, 55, 45, 70]

# 畫布設置
fig = plt.figure()
# 1,1,1表示一張畫布切割成1行1列共一張圖的第1個;2,2,1表示一張畫布切割成2行2列共4張圖的第一個(左上角)
ax1 = fig.add_subplot(1, 1, 1)
ax1.bar(classes_index, student_amounts, align='center', color='darkblue')
ax1.xaxis.set_ticks_position('bottom')
ax1.yaxis.set_ticks_position('left')

plt.xticks(classes_index,
           classes,
           rotation=0,
           fontsize=13,
           fontproperties=font)
plt.xlabel('班級', fontproperties=font, fontsize=15)
plt.ylabel('學生人數', fontproperties=font, fontsize=15)
plt.title('班級-學生人數', fontproperties=font, fontsize=20)
# 保存圖片,bbox_inches='tight'去掉圖形四周的空白
# plt.savefig('classes_students.png?x-oss-process=style/watermark', dpi=400, bbox_inches='tight')
plt.show()

img

3.2 直方圖

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

# 修改背景為條紋
plt.style.use('ggplot')

mu1, mu2, sigma = 50, 100, 10
# 構造均值為50的符合正態分布的數據
x1 = mu1 + sigma * np.random.randn(10000)
print(x1)


# 構造均值為100的符合正態分布的數據
x2 = mu2 + sigma * np.random.randn(10000)
print(x2)

fig = plt.figure()
ax1 = fig.add_subplot(121)
# bins=50表示每個變量的值分成50份,即會有50根柱子
ax1.hist(x1, bins=50, color='darkgreen')

ax2 = fig.add_subplot(122)
ax2.hist(x2, bins=50, color='orange')

fig.suptitle('兩個正態分布', fontproperties=font, fontweight='bold', fontsize=15)
ax1.set_title('綠色的正態分布', fontproperties=font)
ax2.set_title('橙色的正態分布', fontproperties=font)
plt.show()

img

3.3 折線圖

import numpy as np
from numpy.random import randn
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

# 修改背景為條紋
plt.style.use('ggplot')

np.random.seed(1)

# 使用numpy的累加和,保證數據取值范圍不會在(0,1)內波動
plot_data1 = randn(40).cumsum()
print(plot_data1)
 
    
    
plot_data2 = randn(40).cumsum()
plot_data3 = randn(40).cumsum()
plot_data4 = randn(40).cumsum()


plt.plot(plot_data1, marker='o', color='red', linestyle='-', label='紅實線')
plt.plot(plot_data2, marker='x', color='orange', linestyle='--', label='橙虛線')
plt.plot(plot_data3, marker='*', color='yellow', linestyle='-.', label='黃點線')
plt.plot(plot_data4, marker='s', color='green', linestyle=':', label='綠點圖')

# loc='best'給label自動選擇最好的位置
plt.legend(loc='best', prop=font)
plt.show()

img

3.4 散點圖+直線圖

import numpy as np
from numpy.random import randn
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

# 修改背景為條紋
plt.style.use('ggplot')

x = np.arange(1, 20, 1)
print(x)



# 擬合一條水平散點線
np.random.seed(1)
y_linear = x + 10 * np.random.randn(19)
print(y_linear)



# 擬合一條x²的散點線
y_quad = x**2 + 10 * np.random.randn(19)
print(y_quad)



# s是散點大小
fig = plt.figure()
ax1 = fig.add_subplot(121)
plt.scatter(x, y_linear, s=30, color='r', label='藍點')
plt.scatter(x, y_quad, s=100, color='b', label='紅點')

ax2 = fig.add_subplot(122)
plt.plot(x, y_linear, color='r')
plt.plot(x, y_quad, color='b')

# 限制x軸和y軸的范圍取值
plt.xlim(min(x) - 1, max(x) + 1)
plt.ylim(min(y_quad) - 10, max(y_quad) + 10)
fig.suptitle('散點圖+直線圖', fontproperties=font, fontsize=20)
ax1.set_title('散點圖', fontproperties=font)
ax1.legend(prop=font)
ax2.set_title('直線圖', fontproperties=font)
plt.show()

img

3.5 餅圖

import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']

fig, ax = plt.subplots(subplot_kw=dict(aspect="equal"))

recipe = ['優', '良', '輕度污染', '中度污染', '重度污染', '嚴重污染', '缺']

data = [2, 49, 21, 9, 11, 6, 2]
colors = ['lime', 'yellow', 'darkorange', 'red', 'purple', 'maroon', 'grey']
wedges, texts, texts2 = ax.pie(data,
                               wedgeprops=dict(width=0.5),
                               startangle=40,
                               colors=colors,
                               autopct='%1.0f%%',
                               pctdistance=0.8)
plt.setp(texts2, size=14, weight="bold")

bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(xycoords='data',
          textcoords='data',
          arrowprops=dict(arrowstyle="->"),
          bbox=None,
          zorder=0,
          va="center")

for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1) / 2. + p.theta1
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    ax.annotate(recipe[i],
                xy=(x, y),
                xytext=(1.25 * np.sign(x), 1.3 * y),
                size=16,
                horizontalalignment=horizontalalignment,
                fontproperties=font,
                **kw)

ax.set_title("餅圖示例",fontproperties=font)

plt.show()
# plt.savefig('jiaopie2.png?x-oss-process=style/watermark')

img

3.6 箱型圖

import numpy as np
import pandas as pd
from numpy.random import randn
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
plt.figure(figsize=(10, 4))
# 創建圖表、數據

f = df.boxplot(
    sym='o',  # 異常點形狀,參考marker
    vert=True,  # 是否垂直
    whis=1.5,  # IQR,默認1.5,也可以設置區間比如[5,95],代表強制上下邊緣為數據95%和5%位置
    patch_artist=True,  # 上下四分位框內是否填充,True為填充
    meanline=False,
    showmeans=True,  # 是否有均值線及其形狀
    showbox=True,  # 是否顯示箱線
    showcaps=True,  # 是否顯示邊緣線
    showfliers=True,  # 是否顯示異常值
    notch=False,  # 中間箱體是否缺口
    return_type='dict'  # 返回類型為字典
)
plt.title('boxplot')

for box in f['boxes']:
    box.set(color='b', linewidth=1)  # 箱體邊框顏色
    box.set(facecolor='b', alpha=0.5)  # 箱體內部填充顏色
for whisker in f['whiskers']:
    whisker.set(color='k', linewidth=0.5, linestyle='-')
for cap in f['caps']:
    cap.set(color='gray', linewidth=2)
for median in f['medians']:
    median.set(color='DarkBlue', linewidth=2)
for flier in f['fliers']:
    flier.set(marker='o', color='y', alpha=0.5)
# boxes, 箱線
# medians, 中位值的橫線,
# whiskers, 從box到error bar之間的豎線.
# fliers, 異常值
# caps, error bar橫線
# means, 均值的橫線

img

四、圖像標注參數

設置圖像標題 plt.title()
設置x軸名稱 plt.xlabel()
設置y軸名稱 plt.ylabel()
設置X軸范圍 plt.xlim()
設置Y軸范圍 plt.ylim()
設置X軸刻度 plt.xticks()
設置Y軸刻度 plt.yticks()
設置曲線圖例 plt.legend()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM