matplotlib API入门
首先开启交互模式
import matplotlib.pyplot as plt
plt.ion()
ps:如果不开启交互模式,则plt.show()会阻止命令的继续输入。
matplotlib的图像都位于Figure对象中
flg=plt.figure()
在子图中才能真正绘图
add_subplot(2,2,1)参数的含义:将画布分成2行2列,取其中从左到右,从上到下的第1块
ax1=flg.add_subplot(2,2,1)
ax2=flg.add_sibplot(2,2,2)
ax3=flg.add_subplot(2,2,3)
使用plt.plot进行绘图
plt.plot(np.random.randn(50).cumsum(),'k--')
image.png
一次性创建一个figure和多个subplot
fig,axes=plt.subplots(2,3)
image.png
调整subplot周围的间距
In [198]: fig,axes=plt.subplots(2,2,sharex=True,sharey=True)
In [199]: 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)
...:
In [200]: plt.subplots_adjust(wspace=0,hspace=0)
image.png
颜色、标记和线型
In [237]: plt.plot(np.random.randn(30).cumsum(),color='k',linestyle='dashed',marker='o')
image.png
刻度、标签和图例
对于大多数的图表装饰项,其主要实现方式有二:使用过程型的pyplot接口(例如,matplotlib.pyplot)以及更为面向对象的原生matplotlib API
xlim、xticks和xticklabels
xlim:获取/设置x轴的[显示]范围
In [240]: plt.xlim([0,10])
Out[240]: (0, 10)
设置标题、轴标签、刻度以及刻度标签
设置标题
ps:使用plt.plot函数后即可以使用ax来画图
ax.set_title()
设置刻度,及刻度标签
In [267]: ticks=ax.set_xticks([0,250,500,750,1000])
In [274]: labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],
...: ....: rotation=30, fontsize='small')
image.png
添加图例(legend)
在使用add_subplot()时添加参数label,再调用ax.legend()即可
In [45]: fig = plt.figure(); ax = fig.add_subplot(1, 1, 1)
In [46]: ax.plot(randn(1000).cumsum(), 'k', label='one')
Out[46]: [<matplotlib.lines.Line2D at 0x7fb624bdf860>]
In [47]: ax.plot(randn(1000).cumsum(), 'k--', label='two')
Out[47]: [<matplotlib.lines.Line2D at 0x7fb624be90f0>]
In [48]: ax.plot(randn(1000).cumsum(), 'k.', label='three')
Out[48]: [<matplotlib.lines.Line2D at 0x7fb624be9160>]
ax.legend(loc='best')
参数loc='best'表示将图例显示在系统认为最好的位置
注解以及在Subplot上绘图
注解
In [304]: ax.text(265,40,'Hello world',family='monospace',fontsize=10)
Out[304]: Text(265,40,'Hello world')
示例,我们根据最近的标准普尔500指数价格(来自Yahoo!Finance)绘制一张曲线图
目的:显示2007/1/1-2011/1/1的变化k线图(并标注三个重要时间点)**
from datetime import datetime
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)#Series对象可以调用plot方法
data = pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)
spx = data['SPX']
spx.plot(ax=ax, style='k-')
crisis_data = [
(datetime(2007, 10, 11), 'Peak of bull market'),
(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),
xytext=(date, spx.asof(date) + 225),
arrowprops=dict(facecolor='black', headwidth=4, width=2,
headlength=4),
horizontalalignment='left', verticalalignment='top')
# Zoom in on 2007-2010
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')
ax.annotate方法详解
ax.annotate(label, xy=(date, spx.asof(date) + 75),
xytext=(date, spx.asof(date) + 225),
arrowprops=dict(facecolor='black', headwidth=4, width=2,
headlength=4),
label:注解的内容
xy:标注的位置(显示为箭头的位置)
xytext:注解内容的位置
arrowprops:标注的箭头
plt.cla()
撤销上一步的操作
在图表中添加图形
要在图表中添加一个图形,你需要创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中
rect=plt.Rectangle((0.2,0.75),0.4,0.15,color='purple',alpha=0.1)##alpha表示透明度
ax.add_patch(rect)
将图表保存到文件
fig.savefig('first_fig.svg')
image.png
matplotlib配置
'''
plr.rc()
'''
使用pandas和seaborn绘图
DataFrame和Series对象自带的plot方法就可以绘图
s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
Series对象的索引会传入matplotlib中用以绘制x轴
image.png image.png柱状图
lot.bar()和plot.barh()
Series
fig, axes = plt.subplots(2, 1)
data=pd.Series(np.random.rand(16),index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0],color='black',alpha=0.8)
data.plot.barh(ax=axes[1],color='gray')
image.png
DataFrame
df=pd.DataFrame(np.random.rand(6,4),columns=['one','two','three','foour'])
df.plot.bar()
参数stack=True设置为堆叠
df.plot.bar(stacked=True)
一个小案例:对于以下表格,用图标直观的表示出一周的每天的聚会情况(各个规模的聚会的占比)
选取day作为索引,size作为研究列
fig=plt.figure();ax=fig.add_subplot()
tips=pd.read_csv('examples/tips.csv')
data=pd.crosstab(tips['day'],tips['size'])
data
image.png
为了使数据更好看,选取size为2-5的数据
data=data.iloc[:,1:5]
image.png
得到不同size在不同天数的占比
party_pot=data.div(data.sum(axis=1),axis=0)
party_pot
image.png
party_pot.plot.bar(ax=ax)
image.png
通过图表分析得到:聚会在工作日会更多,但在周末的规模更大
使用seaborn画出图标显示一周各天消费的比例
tips['tip_pot']=tips['tip']/(tips['total_bill']-tips['tip'])
tips.head(10)
image.png
使用seaborn.barplot方法利用矩阵条的高度反映数值变量的集中趋势,
seaborn.barplt()接受参数:
data:数据集
x:用作x轴的data的列
y:用作y轴的data的列
orient:数轴朝向
hue:色彩,加入一个考虑因素
ax1=fig.add_subplot()
sns.barplot(data=tips,y='day',x='tip_pot')
如图,可以看到周日的小费比例最高,集中在0.23左右
image.png
sns.barplot(data=tips,y='day',x='tip_pot',hue='smoker')
image.png
如上图,可以看到,抽烟者手脚更大。
还可以通过set方法改变风格
sns.set(style="whitegrid")
直方图和密度图
直方图:表示一组数据在各个数据区间出现的频数,即数据的分布情况
tips['tip_pot'].plot.hist(bins=100)
bins参数表示划分的数据小区间的数量
image.png
(上图中,纵轴为频数,横轴为数据)
密度图:对象.plot.density()
与直方图意义类似,都是表示一组数据的分布情况
不过密度图是用一条平滑的曲线表示分布情况
tips['tip_pot'].plot.density()
image.png
使用sns.distplot同时画出直方图和密度图
sns.distplot(tips['tip_pot'],bins=100,color='purple')
image.png
散布图或点图
//tobecontinue
网友评论