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()
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()
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()
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()
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')
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, 均值的橫線
四、圖像標注參數
設置圖像標題 | plt.title() |
---|---|
設置x軸名稱 | plt.xlabel() |
設置y軸名稱 | plt.ylabel() |
設置X軸范圍 | plt.xlim() |
設置Y軸范圍 | plt.ylim() |
設置X軸刻度 | plt.xticks() |
設置Y軸刻度 | plt.yticks() |
設置曲線圖例 | plt.legend() |