matplotlib官方文檔:https://matplotlib.org/contents.html?v=20190307135750python
matplotlib是一個繪圖庫,它能夠建立經常使用的統計圖,包括條形圖、箱型圖、折線圖、散點圖、餅圖和直方圖。dom
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))
[0, 1, 2, 3]函數
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()
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)
[59.00855949 43.16272141 48.77109774 ... 57.94645859 54.70312714
58.94125528]字體
# 構造均值爲100的符合正態分佈的數據 x2 = mu2 + sigma * np.random.randn(10000) print(x2)
[115.19915511 82.09208214 110.88092454 ... 95.0872103 104.21549068
133.36025251]3d
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()
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)
[ 1.62434536 1.01258895 0.4844172 -0.58855142 0.2768562 -2.02468249
-0.27987073 -1.04107763 -0.72203853 -0.97140891 0.49069903 -1.56944168
-1.89185888 -2.27591324 -1.1421438 -2.24203506 -2.41446327 -3.29232169
-3.25010794 -2.66729273 -3.76791191 -2.6231882 -1.72159748 -1.21910314
-0.31824719 -1.00197505 -1.12486527 -2.06063471 -2.32852279 -1.79816732
-2.48982807 -2.8865816 -3.5737543 -4.41895994 -5.09020607 -5.10287067
-6.22018102 -5.98576532 -4.32596314 -3.58391898]excel
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()
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)
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]code
# 擬合一條水平散點線 np.random.seed(1) y_linear = x + 10 * np.random.randn(19) print(y_linear)
[ 17.24345364 -4.11756414 -2.28171752 -6.72968622 13.65407629
-17.01538697 24.44811764 0.38793099 12.19039096 7.50629625
25.62107937 -8.60140709 9.77582796 10.15945645 26.33769442
5.00108733 15.27571792 9.22141582 19.42213747]orm
# 擬合一條x²的散點線 y_quad = x**2 + 10 * np.random.randn(19) print(y_quad)
[ 6.82815214 -7.00619177 20.4472371 25.01590721 30.02494339
45.00855949 42.16272141 62.77109774 71.64230566 97.3211192
126.30355467 137.08339248 165.03246473 189.128273 216.54794359
249.28753869 288.87335401 312.82689651 363.3441569htm
# 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()
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')
包含一組數據的:最大值、最小值、中位數、上四分位數(Q3)、下四分位數(Q1)、異常值
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, 均值的橫線
import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties %matplotlib inline # 找到本身電腦的字體路徑,而後修改字體路徑 font = FontProperties(fname='/Library/Fonts/Heiti.ttc') header_list = ['方程組', '函數', '導數', '微積分', '線性代數', '機率論', '統計學'] py3_df = pd.read_excel('py3.xlsx', header=None, skiprows=[0, 1], names=header_list) # 處理帶有NaN的行 py3_df = py3_df.dropna(axis=0) print(py3_df) # 自定義映射 map_dict = { '不會': 0, '瞭解': 1, '熟悉': 2, '使用過': 3, } for header in header_list: py3_df[header] = py3_df[header].map(map_dict) unable_series = (py3_df == 0).sum(axis=0) know_series = (py3_df == 1).sum(axis=0) familiar_series = (py3_df == 2).sum(axis=0) use_series = (py3_df == 3).sum(axis=0) unable_label = '不會' know_label = '瞭解' familiar_label = '熟悉' use_label = '使用過' for i in range(len(header_list)): bottom = 0 # 描繪不會的條形圖 plt.bar(x=header_list[i], height=unable_series[i], width=0.60, color='r', label=unable_label) if unable_series[i] != 0: plt.text(header_list[i], bottom, s=unable_series[i], ha='center', va='bottom', fontsize=15, color='white') bottom += unable_series[i] # 描繪瞭解的條形圖 plt.bar(x=header_list[i], height=know_series[i], width=0.60, color='y', bottom=bottom, label=know_label) if know_series[i] != 0: plt.text(header_list[i], bottom, s=know_series[i], ha='center', va='bottom', fontsize=15, color='white') bottom += know_series[i] # 描繪熟悉的條形圖 plt.bar(x=header_list[i], height=familiar_series[i], width=0.60, color='g', bottom=bottom, label=familiar_label) if familiar_series[i] != 0: plt.text(header_list[i], bottom, s=familiar_series[i], ha='center', va='bottom', fontsize=15, color='white') bottom += familiar_series[i] # 描繪使用過的條形圖 plt.bar(x=header_list[i], height=use_series[i], width=0.60, color='b', bottom=bottom, label=use_label) if use_series[i] != 0: plt.text(header_list[i], bottom, s=use_series[i], ha='center', va='bottom', fontsize=15, color='white') unable_label = know_label = familiar_label = use_label = '' plt.xticks(header_list, fontproperties=font) plt.ylabel('人數', fontproperties=font) plt.title('Python3期數學摸底可視化', fontproperties=font) plt.legend(prop=font, loc='upper left') plt.show()
方程組 函數 導數 微積分 線性代數 機率論 統計學
0 使用過 使用過 不會 不會 不會 不會 不會
1 使用過 使用過 瞭解 不會 不會 不會 不會
2 使用過 使用過 熟悉 不會 不會 不會 不會
3 熟悉 熟悉 熟悉 瞭解 瞭解 瞭解 瞭解
4 使用過 使用過 使用過 使用過 使用過 使用過 使用過
5 使用過 使用過 使用過 不會 不會 不會 瞭解
6 熟悉 熟悉 熟悉 熟悉 熟悉 熟悉 不會
7 使用過 使用過 使用過 使用過 使用過 使用過 使用過
8 熟悉 熟悉 熟悉 熟悉 熟悉 使用過 使用過
9 熟悉 熟悉 使用過 不會 使用過 使用過 不會
10 使用過 使用過 熟悉 熟悉 熟悉 熟悉 熟悉
11 使用過 使用過 使用過 使用過 使用過 不會 不會
12 使用過 使用過 使用過 使用過 使用過 使用過 使用過
13 使用過 使用過 瞭解 不會 不會 不會 不會
14 使用過 使用過 使用過 使用過 使用過 不會 不會
15 使用過 使用過 熟悉 不會 不會 不會 不會
16 熟悉 熟悉 使用過 使用過 使用過 不會 不會
17 使用過 使用過 使用過 瞭解 不會 不會 不會
18 使用過 使用過 使用過 使用過 熟悉 熟悉 熟悉
19 使用過 使用過 使用過 瞭解 不會 不會 不會
20 使用過 使用過 使用過 使用過 使用過 使用過 使用過
21 使用過 使用過 使用過 使用過 使用過 使用過 使用過
22 使用過 很瞭解 熟悉 瞭解一點,不會運用 瞭解一點,不會運用 瞭解 不會
23 使用過 使用過 使用過 使用過 熟悉 使用過 熟悉
24 熟悉 熟悉 熟悉 使用過 不會 不會 不會
25 使用過 使用過 使用過 使用過 使用過 使用過 使用過
26 使用過 使用過 使用過 使用過 使用過 不會 不會
27 使用過 使用過 不會 不會 不會 不會 不會
28 使用過 使用過 使用過 使用過 使用過 使用過 瞭解
29 使用過 使用過 使用過 使用過 使用過 瞭解 不會
30 使用過 使用過 使用過 使用過 使用過 不會 不會
31 使用過 使用過 使用過 使用過 不會 使用過 使用過
32 熟悉 熟悉 使用過 使用過 使用過 不會 不會
33 使用過 使用過 使用過 使用過 熟悉 使用過 熟悉
34 熟悉 熟悉 熟悉 使用過 使用過 熟悉 不會
35 使用過 使用過 使用過 使用過 使用過 使用過 使用過
36 使用過 使用過 使用過 使用過 使用過 使用過 瞭解
37 使用過 使用過 使用過 使用過 使用過 不會 不會
38 使用過 使用過 使用過 不會 不會 不會 不會
39 使用過 使用過 不會 不會 不會 不會 不會
40 使用過 使用過 使用過 使用過 使用過 不會 不會
41 使用過 使用過 熟悉 瞭解 瞭解 瞭解 不會
42 使用過 使用過 使用過 不會 不會 不會 不會
43 熟悉 使用過 瞭解 瞭解 不會 不會 不會