目录
matplotlib API入门-Figure和Subplot
绘图是数据分析工作的最重要任务之一,是探索的一部分。
matplotlib API入门-Figure和Subplot
matplotlib函数位于Figure函数中,当你用plt.figure新建一个Figure时就会弹出一个窗口。
>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax1 = fig.add_subplot(2,2,1)
>>> ax2 = fig.add_subplot(2,2,2)
>>> ax3 = fig.add_subplot(2,2,3)
‘k--’是一个线型选项,用来绘制黑色虚线图,
>>> from numpy.random import randn
>>> import numpy as np
>>> plt.plot(randn(50).cumsum(),'k--')
[<matplotlib.lines.Line2D object at 0x000000000E6F3780>]
>>> _=ax1.hist(randn(100),bins=20,color='k',alpha=0.3)
>>> ax2.scatter(np.arange(30),np.arange(30)+3*randn(30))
<matplotlib.collections.PathCollection object at 0x000000000E70E048>
>>> fig,axes = plt.subplots(2,3)
>>> axes
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000000001475E390>,
<matplotlib.axes._subplots.AxesSubplot object at 0x00000000149C2438>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000014C2ABA8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000000014CAB358>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000014D1DAC8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000014D9E208>]],
dtype=object)
plt.subplots可以轻松的创建新的Figure对象,并返回已经创建的subplot对象的NumPy数组
>>> axes[0,1].scatter(np.arange(30),np.arange(30)+3*randn(30))
<matplotlib.collections.PathCollection object at 0x0000000014E5F320>
调整subplot周围间距
默认情况下matplot会在subplot外围流下一定的边距,subplot之间也会流下间距,间距跟图像的高度与宽度有关。
此外,他是个顶级函数。
>>> import matplotlib.pyplot as plt
Backend TkAgg is interactive backend. Turning interactive mode on.
>>> fig,axes = plt.subplots(2,2,sharex=True,sharey=True)
import numpy as np
for i in range(2):
for j in range(2):
axes[i,j].hist(np.random.randn(500),bins=50,color='k',alpha=0.5)
plt.subplots_adjust(wspace=0,hspace=0)
颜色、标记和线型
matplotlib的plot函数接受一组X和Y坐标,还可以接受一个表示颜色和线型的字符串缩写。
例如:ax.plot(x,y,'g--') | ax.plot(x,y,linestyle='--',color='g')
其他颜色可以通过指定的RGB值的形式使用,例如‘#CECECE’
plot(np.random.randn(30).cumsum(),color='k',linestyle='deshed',marker='o')或如下
>>> plt.plot(np.random.randn(30).cumsum(),'ko--')
[<matplotlib.lines.Line2D object at 0x0000000012D12B00>]
在线型图中,非实际数据点默认按线性方式插值的,可以通过drawstyle选项修改:
>>> data = np.random.randn(30).cumsum()
>>> plt.plot(data,'g--',label='Default')
[<matplotlib.lines.Line2D object at 0x0000000012FF68D0>]
>>> plt.plot(data,'r--',drawstyle='steps-post',label='steps-post')
[<matplotlib.lines.Line2D object at 0x000000001303DAC8>]
>>> plt.legend(loc='best')
<matplotlib.legend.Legend object at 0x0000000013003048>
刻度标签和图例---设置标题、轴标签、及刻度高度
对于大多数图标装饰项,其主要实现方式有二:使用过程型的pyplot接口以及更为面向对象的原生matplotlib API
pyplot接口的设计目的就是交互式使用,诸如xlim,xtiks,xticklabels之类的方法。他们分别表示控制图标的范围,刻度位置,刻度标签等。
>>> fig = plt.figure();ax = fig.add_subplot(1,1,1)
>>> ax.plot(np.random.randn(1000).cumsum())
[<matplotlib.lines.Line2D object at 0x00000000132C5E10>]
>>> fig = plt.figure();ax = fig.add_subplot(1,1,1)
>>> ax.plot(np.random.randn(1000).cumsum())
[<matplotlib.lines.Line2D object at 0x00000000132C5E10>]
>>> ticks = ax.set_xticks([0,250,500,750,1000])
>>> lables = ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small')
>>> ax.set_title('My First matplotlib plot')
Text(0.5,1,'My First matplotlib plot')
>>> ax.set_xlabel('Stages')
Text(0.5,10.7639,'Stages')
添加图例
>>> fig = plt.figure();ax = fig.add_subplot(1,1,1)
>>> ax.plot(np.random.randn(1000).cumsum(),'k',label='one')
[<matplotlib.lines.Line2D object at 0x00000000138E7A58>]
>>> ax.plot(np.random.randn(1000).cumsum(),'k--',label='two')
[<matplotlib.lines.Line2D object at 0x0000000013A46F98>]
>>> ax.plot(np.random.randn(1000).cumsum(),'k.',label='three')
[<matplotlib.lines.Line2D object at 0x0000000013B7CC18>]
>>> ax.legend(loc='best')
<matplotlib.legend.Legend object at 0x0000000013356F98>
在Subplot上绘图
>>> fig = plt.figure()
>>> ax = fig.add_subplot(1,1,1)
>>> rect = plt.Rectangle((0.2,0.75),0.4,0.15,color='k',alpha=0.3)
>>> circ = plt.Circle((0.7,0.2),0.15,color='b',alpha=0.3)
>>> paon = plt.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]],color='g',alpha=0.5)
>>> ax.add_patch(rect)
<matplotlib.patches.Rectangle object at 0x0000000013DC6080>
>>> ax.add_patch(circ)
<matplotlib.patches.Circle object at 0x000000001358A208>
>>> ax.add_patch(paon)
<matplotlib.patches.Polygon object at 0x0000000013B71E80>
将图标到存到文件
plt.savefig("D:\python\DataAnalysis\\r_c_p.svg")
pandas中的绘图函数
matplotlib实际上是一种比较原始的工具,要绘制一张图标需要各种组件才行,而pandas相对于简单一些。
线形图
Series和Dataframe都有一个生成图标的plot方法。默认是线形图
>>> s = Series(np.random.randn(10).cumsum(),index = np.arange(0,100,10))
>>> s.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000013DD05C0>
>>> df = DataFrame(np.random.randn(10,4).cumsum(0),columns=['A','B','C','D'],index=np.arange(0,100,10))
>>> df.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000015570630>
柱状图
>>> data.plot(kind='bar',ax=axes[0],color='k',alpha=0.7)
<matplotlib.axes._subplots.AxesSubplot object at 0x00000000157E6048>
>>> data.plot(kind='barh',ax=axes[1],color='k',alpha=0.7)
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000015983400>
>>> party_counts = DataFrame([[1,16,1,1,0,0],[2,53,18,13,1,0],[0,39,15,18,3,1],[1,48,4,5,1,3]],index=['Fir','Sat','Sun','Thur'],columns=[1,2,3,4,5,6])
>>> party_counts
1 2 3 4 5 6
Fir 1 16 1 1 0 0
Sat 2 53 18 13 1 0
Sun 0 39 15 18 3 1
Thur 1 48 4 5 1 3
>>> party_counts.plot(kind='bar',stacked=True)
<matplotlib.axes._subplots.AxesSubplot object at 0x00000000124427B8>
散布图
散布图是观察两个以为数据序列之间的关系的有效手段。
简单的散布图:
>>> data1 = Series(np.random.randn(100))
>>> data2 = Series(np.random.randn(100))
>>> plt.scatter(data1,data2)
>>> df = DataFrame(np.random.randn(100,4))
>>> pd.scatter_matrix(df)