# -*- coding: utf-8 -*- import time import matplotlib.pyplot as plt import matplotlib import numpy as np import pandas as pd from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] mpl.rcParams['axes.unicode_minus'] = False #折線圖、柱狀圖,柱狀堆疊圖、面積圖、填圖、餅圖、直方圖、堆疊直方圖、密度圖、散點圖、箱型圖 #line、 bar、 stacked bar、area、fill、pie、hist、stacked hist、kde、scatter、box #plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None, # legend=False, style=None, logx=False, logy=False, loglog=False, xticks=None, # yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None, # table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds) """ 兩種方法生成graph 方法一:pandas, pd.plot() 1、這種數據會使用索引 2、Series:可以使用kind= ['line','bar','area','no—fill','pie','hist','kde','no-scatter','box'] 因為只有一個,所以不能夠stacked=True 3、DataFrame:可以使用, ['line','stacked line','bar','stacked bar','area','stacked area', 'no-fill','no-stacked fill','pie','stacked pie','hist','stacked hist', 'kde','stacked kde','scatter','stacked scatter','box','stacked box'] 書寫方式可以這樣 series_or_dataframe.plot(kind = 'a_kind')<===>series_or_dataframe.plot.a_kind() 方法二:常規序列 plt.plot(xdata,ydata) plt.bar() 方法三:使用pandas,這個就是方法1將kind的值提出來 series_or_dataframe.hist series_or_dataframe.boxplot """ """ 只能用一種方法 fill 填圖 和坐標軸填充用fill,axes[0,1].fill()/plt.fill() 兩個函數之間的填充: axes[0,0].fill_between()/plt.fill_between() scatter 散點圖 plt.scatter需要將橫縱坐標都放進去,plt.scatter() axes[0,1].scatter() """ #pandas直接生成圖 def series_graph(): a = pd.Series(np.random.randint(0, 10, 10)) a.plot(kind = 'line') # kind → line,bar,barh,hist..(折線圖,柱狀圖,柱狀圖-橫...) # style → 風格字符串,這里包括了linestyle(-),marker(.),color(g) # color → 顏色,有color指定時候,以color顏色為准 # alpha → 透明度,0-1 # use_index → 將索引用為刻度標簽,默認為True # rot → 旋轉刻度標簽,0-360 # grid → 顯示網格,一般直接用plt.grid # figsize → 圖像大小 #其他的參數還可以根據基本元素設置,在matplotlib_basic_element_and_argument plt.show() def dataframe_graph(): # line、 bar、 stacked bar、area、fill、pie、hist、stacked hist、kde、scatter、box a = pd.DataFrame(np.random.randint(10,size=(10,4)),columns = [1,1,1,2]) print(a) a.plot(stacked= True,kind = 'pie') plt.show() def series_line_subplot(): a = pd.Series(np.random.randint(0,10,100)) print(a) b = pd.Series(np.random.randint(10,20,100)) print(b) fig, axes = plt.subplots(2,2) axes[0,0].plot(a) axes[1,1].plot(b) plt.show() #不使用pandas def line_subplot(): a = np.arange(100) fig, axes = plt.subplots(2,2) axes[0,0].plot(a) plt.show() def dataframe_line_subplot(): a = pd.DataFrame(np.random.randint(10, size=(10, 4)), columns=['a', 'b', 'c', 'd']) print(a) b = pd.DataFrame(np.random.randint(10, size=(10, 4)), columns=['a', 'b', 'c', 'd']) print(b) fig,axes = plt.subplots(2,2) axes[0,0].plot(a) axes[1,1].plot(b) plt.show() if __name__=='__main__': F = 1 if F == -1: series_graph() print("""'Series:可以使用kind= ['line','bar(h)','area','no—fill','pie','hist','kde','no-scatter','box'] 因為只有一個,所以不能夠stacked=True'""") elif F ==-2: dataframe_graph() print("""DataFrame:可以使用, ['line','stacked line','bar(h)','stacked bar','area','stacked area', 'no-fill','no-stacked fill','pie','stacked pie','hist','stacked hist', 'kde','stacked kde','scatter','stacked scatter','box','stacked box']""") elif F == 1: line() elif F == 2: bar() elif F == 3: pie() elif F == 4: hist();print("'series.hist'") elif F == 5: box1() elif F == 6: box2() elif F == 11: fill() elif F == 12: scatter()
折線圖
#折線圖 def line(): a = np.arange(100) print(a) plt.plot(a,a) plt.xlabel('我是') plt.show()
散點圖 def scatter(): # plt.scatter()散點圖 # plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, # alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs) plt.figure(figsize=(8, 6)) x = np.random.randn(1000) y = np.random.randn(1000) plt.scatter(x, y, marker='.', s=np.random.randn(1000) * 100, cmap='Reds', c=y, alpha=0.8, ) plt.grid() # s:散點的大小 # c:散點的顏色 # vmin,vmax:亮度設置,標量 # cmap:colormap plt.show()
柱狀圖 def bar(): # 柱狀圖 plt.bar() plt.figure(figsize=(10, 4)) x = np.arange(10) y1 = np.random.rand(10) y2 = -np.random.rand(10) plt.bar(x, y1, width=1, facecolor='yellowgreen', edgecolor='white', yerr=y1 * 0.1) plt.bar(x, y2, width=1, facecolor='lightskyblue', edgecolor='white', yerr=y2 * 0.1) # x,y參數:x,y值 # width:寬度比例 # facecolor柱狀圖里填充的顏色、edgecolor是邊框的顏色 # left-每個柱x軸左邊界,bottom-每個柱y軸下邊界 → bottom擴展即可化為甘特圖 Gantt Chart # align:決定整個bar圖分布,默認left表示默認從左邊界開始繪制,center會將圖繪制在中間位置 # xerr/yerr :x/y方向誤差 for i, j in zip(x, y1): plt.text(i + 0.3, j - 0.15, '%.2f' % j, color='white') for i, j in zip(x, y2): plt.text(i + 0.3, j + 0.05, '%.2f' % -j, color='white') plt.axvline(0,color = 'r', linewidth=3)#放置0刻度線 plt.axhline(0,color = 'k',linewidth=3)#放置縱向0刻度線 #每個不同的bar設置不同的顏色 bar = plt.bar(x, y1, width=1, facecolor='yellowgreen', edgecolor='white', yerr=y1 * 0.1) for bar, height in zip(bar, y1): if height < 0: bar.set(color='lightgreen') # 給圖添加text # zip() 函數用於將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表。 plt.show() #顯示多組柱狀圖 import matplotlib.pyplot as plt a = [1,2,3] b = [4,5,6] d = [7,8,9] y = [1,2,3] width = 0.2 plt.bar([i-width for i in y],a,color = 'r',width=width) plt.bar(y,b,color = 'k',width=width) plt.bar([i+width for i in y],d,color='g',width=width) plt.show() import matplotlib.pyplot as plt # 獲取bar的長寬高的信息,來設置文本 x = [10, 20,30] y = [1,2,3] bars = plt.bar(x,y,width=5) for bar,data in zip(bars, x): x = bar.get_height()#bar的高度 y = bar.get_x()#bar的寬度的其實位置 m = bar.get_width()#bar的寬度 n = bar.get_y()#bar的底部 print(x,y,m,n) plt.text(y,x,data) plt.show() import matplotlib.pyplot as plt #在bar中繪制不同的線來區分 x = list(range(10,18)) y = list(range(1,9)) bars = plt.bar(x,y) patterns = ('-','+','×','*','\\','o','--','.') for bar , pattern in zip(bars, patterns): bar.set_hatch(pattern) plt.show()
直方圖、密度圖
def hist(): # 直方圖+密度圖 s = pd.Series(np.random.randn(1000)) s.hist(bins=20, histtype='bar', align='mid', orientation='vertical', alpha=0.5, normed=True) # bin:箱子的寬度 # normed 標准化 # histtype 風格,bar,barstacked,step,stepfilled # orientation 水平還是垂直{‘horizontal’, ‘vertical’} # align : {‘left’, ‘mid’, ‘right’}, optional(對齊方式) s.plot(kind='kde', style='k--') plt.show() # 密度圖 import matplotlib.pyplot as plt a = [1,2,3,1] plt.hist(a) plt.show() 如果有多個直方圖,那么可以用alpha這個透明度來區分 直方圖是什么呢? 將所有的data進行整理,data中每個取值有多少個。
餅圖
餅圖 def pie(): s = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series') plt.axis('equal') # 保證長寬相等 plt.pie(s, explode=[0.1, 0, 0, 0], labels=s.index, colors=['r', 'g', 'b', 'c'], autopct='%.2f%%', pctdistance=0.6, labeldistance=1.2, shadow=True, startangle=0, radius=1.5, frame=False) plt.show() print(s) # 第一個參數:數據 # explode:指定每部分的偏移量,餅圖之間都是分開的 # labels:標簽 # colors:顏色 # autopct:餅圖上的數據標簽顯示方式 # pctdistance:每個餅切片的中心和通過autopct生成的文本開始之間的比例 # labeldistance:被畫餅標記的直徑,默認值:1.1 # shadow:陰影 # startangle:開始角度 # radius:半徑 # frame:圖框 # counterclock:指定指針方向,順時針或者逆時針 import matplotlib.pyplot as plt boy = 43 girl = 54 labels = ['girl','boy']#餅圖外面的類別指示 patches,texts, autotexts = plt.pie([girl,boy],labels = labels,autopct='%1.1f%%', colors = ['r','b'],explode = [0.05,0.05]) #labels:餅圖外面的類別指示 #autopct:餅圖上的百分比信息,當然自己也可以放置別的 #texts:餅圖外面的文字,也就是類別信息 for text in autotexts: text.set_color('white') text.set_fontsize(16) for t in texts: t.set_color('black') t.set_fontsize(16) plt.show(
箱型圖
def box1(): # 箱型圖 # plt.plot.box()繪制 fig, axes = plt.subplots(2, 1, figsize=(10, 6)) df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E']) color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray') # 箱型圖着色 # boxes → 箱線 # whiskers → 分位數與error bar橫線之間豎線的顏色 # medians → 中位數線顏色 # caps → error bar橫線顏色 ########################################### df.plot.box(ylim=[0, 1.2], grid=True, color=color, ax=axes[0]) # color:樣式填充 ########################################### df.plot.box(vert=False, positions=[1, 4, 5, 6, 8], ax=axes[1], grid=True, color=color) # vert:是否垂直,默認True # position:箱型圖占位 plt.show() def box2(): # 箱型圖 # plt.boxplot()繪制 # pltboxplot(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, manage_xticks=True, autorange=False, # zorder=None, hold=None, data=None) 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') print(f) 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, 均值的橫線,
填圖
def fill(): # 填圖 fig, axes = plt.subplots(2, 1, figsize=(8, 6)) x = np.linspace(0, 1, 500) y1 = np.sin(4 * np.pi * x) * np.exp(-5 * x) y2 = -np.sin(4 * np.pi * x) * np.exp(-5 * x) axes[0].fill(x, y1, 'r', alpha=0.5, label='y1') axes[0].fill(x, y2, 'g', alpha=0.5, label='y2') # 對函數與坐標軸之間的區域進行填充,使用fill函數 # 也可寫成:plt.fill(x, y1, 'r',x, y2, 'g',alpha=0.5)#這個是單個填圖的時候 x = np.linspace(0, 5 * np.pi, 1000) y1 = np.sin(x) y2 = np.sin(2 * x) axes[1].fill_between(x, y1, y2, color='b', alpha=0.5, label='area') # 填充兩個函數之間的區域,使用fill_between函數 for i in range(2): axes[i].legend() axes[i].grid() plt.show() # 添加圖例、格網
等高圖
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-10,10,5) y = np.linspace(-20,10,5) """ 繪制二維圖 需要知道的信息 我們需要知道自變量x的取值,以及y對應的取值。 做法: 將每個x帶入函數即可的得到y 繪制三維圖 需要知道的信息 我們需要知道自變量x和y的取值,也就是所有xy的取值組合, 也就是x取第一個值,對應所有的y取值 x取第二個值,對應所有的y取值 。。。 然后將上述各種組合帶入函數中就可以得到z軸 """ xx,yy = np.meshgrid(x,y) print(xx) print(yy) zz = xx**2 + yy**2 plt.figure() plt.contour(xx,yy,zz,20)#contourf這個會填充進去顏色 plt.show() xx,yy = np.meshgrid(x,y) 上面的結果 將下面的兩張表一對一的組合起來就是一個平面的各個坐標圖 xx將x復制5份 yy將y^T復制5份 [[-10. -5. 0. 5. 10.] [-10. -5. 0. 5. 10.] [-10. -5. 0. 5. 10.] [-10. -5. 0. 5. 10.] [-10. -5. 0. 5. 10.]] [[-20. -20. -20. -20. -20. ] [-12.5 -12.5 -12.5 -12.5 -12.5] [ -5. -5. -5. -5. -5. ] [ 2.5 2.5 2.5 2.5 2.5] [ 10. 10. 10. 10. 10. ]]
三維圖方式1
三維散點 # -*- coding: utf-8 -*- """ Created on Thu Sep 24 16:37:21 2015 @author: Eddy_zheng """ import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D data = np.random.randint(0, 255, size=[40, 40, 40]) x, y, z = data[0], data[1], data[2] ax = plt.subplot(111, projection='3d') # 創建一個三維的繪圖工程 # 將數據點分成三部分畫,在顏色上有區分度 ax.scatter(x[:10], y[:10], z[:10], c='y') # 繪制數據點 ax.scatter(x[10:20], y[10:20], z[10:20], c='r') ax.scatter(x[30:40], y[30:40], z[30:40], c='g') ax.set_zlabel('Z') # 坐標軸 ax.set_ylabel('Y') ax.set_xlabel('X') plt.show()
三維圖方式二
三維面 # -*- coding: utf-8 -*- """ Created on Thu Sep 24 16:17:13 2015 @author: Eddy_zheng """ from matplotlib import pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) X = np.arange(-4, 4, 0.25) Y = np.arange(-4, 4, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) # 具體函數方法可用 help(function) 查看,如:help(ax.plot_surface) ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow') plt.show()
三維旋轉角度設置
ax.view_init(elev=32,azim=90)
三維圖旋轉角度
azim:正常的繪制xyz坐標的時候,也就是正視圖,做轉角度
elev:xy平面上翻角度