matplotlib API入门
引入matplotlib
import matplotlib.pyplot as plt
创建一个简单的图形
data = np.arange(10)
plt.plot(data)
Figure和Subplot
matplotlib的图像都位于Figure对象中,可以用plt.figure创建一个新的Figure。
fig = plt.figure()
fig.show()
弹出空白窗口。
不能直接用空Figure绘图,需要通过add_subplot创建一个或多个subplot。
ax1 = fig.add_subplot(2,2,1)
将图像设置为2x2,即最多4张图,且当前选中的是第一个。
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
plt.plot(np.random.randn(50).cumsum(),'k--')
执行前四行代码后执行第五行代码,matplotlib会在最后一个用过的subplot上进行绘制,如果没有会自动创建一个。
k--表示将线型改为黑色虚线。
直接调用fig.add_subplot方法返回的对象可以在其中进行作图。
x1 = ax1.hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
x2 = ax2.scatter(np.arange(30),np.arange(30)+3*np.random.randn(30))
matplotlib有一个plt.subplots,可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组。
fig,axes = plt.subplots(2,3)
调整subplot周围的间距
利用Figure的subplots_adjust方法可以修改subplot之间的间距。
fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
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)
wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距。
两个参数都调整为0.3时。
颜色、标记和线型
ax.plot(x,y,'g--')表示接受一组坐标绘制成线图,线的颜色为绿色,线型为虚线。
ax.plot(x,y,linestyle='--',color='g')和上面效果一样。
常用的颜色可以用颜色缩写,线图可以使用标记强调数据点,标记类型和线型都要在颜色后面。
plt.plot(np.random.randn(30).cumsum(),'ko--')
也可以写成更明确的形式。
plt.plot(np.random.randn(30).cumsum(),color='k',linestyle='dashed',marker='o')
结果和上面的一样。
data = np.random.randn(30).cumsum()
plt.plot(data,'k--',label='Default') #线型为虚线,颜色为灰色,标签为Default
plt.plot(data,'k-',drawstyle='steps-post',label='steps-post') #线型是实线,灰色,标签
plt.legend(loc='best') #自动挑选标签位置
plt.show()
刻度、标签和图例
设置标题、轴标签、刻度及刻度标签
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())
要设置x轴刻度,使用set_xticks方法和set_xticklabels等方法
ticks = ax.set_xticks([0,250,500,750,1000]) #设置横坐标刻度
labels = ax.set_xticklabels(['one','two','three','four','five'],
rotation=30,fontsize='small') #设置横坐标刻度标签,rotation是倾斜度设置,fontsize是字体大小
ax.set_title('My first matplotlib plot') #设置图表标题
ax.set_xlabel('Stages') #设置横坐标标题
y轴的修改方式类似,将x改为y即可。
如果需要批量设置,可以将参数写入一个dict中。
props = {'title':'My first matplotlib plot','xlabel':'Stages'}
ax.set(**props)
添加图例
通过传入label参数添加图例
from numpy.random import randn
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum(),'k',label='one') #1000步随机漫步,图例标签为one,
ax.plot(randn(1000).cumsum(),'k--',label='two') #设置线型为虚线
ax.plot(randn(1000).cumsum(),'k.',label='three') #设置线型为点组成
ax.legend(loc='best') #自动选择最佳图例放置位置
注解以及在Subplot上绘图
from datetime import datetime
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
data = pd.read_csv('examples/spx.csv',index_col=0,parse_dates=True) #取数据,将第一列设置为行索引,parse_dates=True表示解析行索引为日期
spx = data['SPX'] #将data中的SPX列的数据赋值给变量spx
spx.plot(ax=ax,style='k-') #根据spx数据进行绘图,线型为实线
crisis_data = [
(datetime(2007,10,11),'Peak of bull marker'),
(datetime(2008,3,12),'Bear Stearns Fails'),
(datetime(2008,9,15),'Lehman Bankruptcy')
]
for date,label in crisis_data:
ax.annotate(label,xy=(date,spx.asof(date) + 75), #通过annotate方法对图表进行标注
xytext=(date,spx.asof(date) + 225),
arrowprops=dict(facecolor='black',headwidth=4,width=2,
headlength=4),
horizontalalignment='left',verticalalignment='top')
ax.set_xlim(['1/1/2007','1/1/2011']) #设置横坐标区间
ax.set_ylim([600,1800]) #设置纵坐标区间
ax.set_title('Important dates in the 2008-2009 financial crisis') #设置图表标题
plt.show()
annotate方法的label参数是注释文本,xy参数是被注释的坐标点,xytext是注释文字的坐标位置,arrowprops是箭头的参数,
绘制图形,先创建块对象,再通过ax.add_patch()方法将其添加到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) #圆形
pgon = plt.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]],color='g',alpha=0.5) #多边形
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)
alpha参数是设置透明度
将图表保存到文件
使用plt.savefig()方法。
plt.savefig('figpath.png',dpi=400,bbox_inches='tight') #最后一个参数剪除当前图表周围的空白部分
savefig不止能写入磁盘,还能写入任何文件型的对象,下面是将图表以二进制形式写入内存中?
from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()
savefig的其他选项
matplotlib配置
通过plt.rc方法可以自定义图片的参数,如plt.rc('figure',figsize=(10,10))表示将全局的图像默认大小设置为10X10
rc的第一个参数是希望自定义的对象,如figure,axes,xtick,ytick,grid,legend等,后面添加一系列关键字参数,可以将一系列需要自定义的参数用一个dict装起来。
font_options = {'family':'monospace','weight':'bold','size':'smalll'}
plt.rc('font',**font_options)
使用pandas和seaborn绘图
线型图
s = pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()
创建一个Series,索引是0-90,数据是标准正态分布中随机取10个数。
使用Series的plot方法绘出线形图。
Series的plot方法的参数
DataFrame的plot方法会为每列绘制一条线并创建图例,图例标签是列名。
df = pd.DataFrame(np.random.randn(10,4).cumsum(0),
columns=['A','B','C','D'],
index=np.arange(0,100,10))
df.plot()
cumsum(0)表示将每列累计求和。
柱状图
plot.bar()和plot.barh()方法分别绘制水平和垂直的柱状图。
fig, axes = plt.subplots(2, 1)
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)
df = pd.DataFrame(np.random.rand(6,4),
index=['one','two','three','four','five','six'],
columns=pd.Index(['A','B','C','D'],name='Genus'))
df.plot.bar()
列索引行的名称被用作了图例的标题。
设置参数stacked=True即可生成堆积柱状图。
df.plot.barh(stacked=True)
plt.show()
现在想做一张堆积柱状图来展示每天各种聚会规模的数据点的百分比
tips = pd.read_csv('examples/tips.csv') #读取数据
party_counts = pd.crosstab(tips['day'],tips['size']) #根据day列和size列做成交叉表
party_counts = party_counts.loc[:,2:5] #通过索引名称选取所有行和2-5列
party_pcts = party_counts.div(party_counts.sum(1),axis=0)
party_pcts.plot.bar()
对于在绘制图形前,需要进行合计的数据,使用seaborn可以减少工作量。
import seaborn as sns
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip']) #在tips中新建一列
tips.head()
sns.barplot(x='tip_pct',y='day',data=tips,orient='h') #orient参数控制条形是水平还是竖直
上图是小费的每日比例,带有误差条,默认计算的是平均值。
seaborn.barplot有颜色选项,可以通过hue参数设置。
sns.barplot(x='tip_pct',y='day',hue='time',data=tips,orient='h')
可以通过sns.set方法中的style参数设置不同的图形外观。
sns.set(style="whitegrid")
sns.barplot(x='tip_pct',y='day',hue='time',data=tips,orient='h')
plt.show()
直方图和密度图
tips['tip_pct'].plot.hist(bins=50)
使用tips中的tip_pct列创建了直方图,bins=50表示x轴一共细分为50个小区间,如果0-2.5都有数据的话,应该有50条柱子。
与直方图相关的是密度图
tips['tip_pct'].plot.density()
plt.show()
seaborn的distplot方法绘制直方图和密度图更简单,还能同时绘制直方图和连续密度估计图。
comp1 = np.random.normal(0,1,size=200) #从期望值为0,标准差为1的正态总体中随机取200个数
comp2 = np.random.normal(10,2,size=200) #从期望值为10,标准差为2的正态总体中随机取200个数
values = pd.Series(np.concatenate([comp1,comp2])) #通过concatenate方法将comp1和comp2连接起来,形成400个数的一维数组。
sns.distplot(values,bins=100,color='k')
若在distplot方法中传入参数kde=False可以除去正态曲线,hist参数可以控制直方图是否出现。
散布图或点图
macro = pd.read_csv('examples/macrodata.csv') #获取数据
data = macro[['cpi','ml','tbilrate','unemp']] #获取指定列的数据
trans_data = np.log(data).diff().dropna() #对数据进行对数处理,diff方法是用后一个元素减前一个元素得到一个新数组,dropna去掉缺失值
trans_data[-5:]
通过seaborn的regplot方法,可以做一个散布图并加上一条线性回归线。
sns.regplot('m1','unemp',data=trans_data)
plt.title('Changes in log %s versus log %s' % ('m1', 'unemp'))
通过seaborn.pairplot方法可以同时观察一组变量的散布图。
sns.pairplot(trans_data,diag_kind='kde',plot_kws={'alpha':0.2})
plot_kws中的参数设置适用于非对角线上的图形。diag_kind参数设置对角线上的图形。
分面网格和类型数据
如果数据集有额外的分组维度,可以使用seaborn.factorplot方法制作多种分面图。
sns.factorplot(x='day',y='tip_pct',hue='time',col='smoker',kind='bar',data=tips[tips.tip_pct < 1])
参数kind='bar'表示使用柱形图。
sns.factorplot(x='day',y='tip_pct',row='time',col='smoker',kind='bar',data=tips[tips.tip_pct < 1])
sns.factorplot(x='tip_pct',y='day',kind='box',data=tips[tips.tip_pct < 0.5])
创建箱线图,kind='box'表示箱线图。
以上学习笔记主要内容来自:https://www.jianshu.com/p/7a0eafdd1340