工具: matplotlib, pandas
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame
图的创建:
(1)单个图的绘制
创建图对象: fig = plt.figure() # 设置figsize参数可以确保图片保存到磁盘时具备一定的大小和纵横比.
创建轴对象: axis = fig.add_subplot()
plt.gcf()可以获得当前的Figure引用.但是更常用的是获取axis对象,然后调用绘图成员函数完成绘图:
axis.plot(data, linestyle='--', color='k')
matplotlib中的linestyle, color等设置与matlab基本相同.
(2)创建多图
可以用axis = fig.add_subplot(m,n,k)的方式定义增加的子图。但是更简单的方法是:
fig, axes = plt.subplots(m,n) # m行n列的多图矩阵
这句命令可以创建一个新的figure,并且axes就是一个含有已创建的subplot对象的Numpy数组,可以用调用数组元素的方式对subplot进行索引。还可以指定subplots的其他参数,例如使得子图之间具有相同的x轴或者y轴(否则matplotlib会自动缩放各子图的坐标轴界限)
(3)调整子图的间距
利用subplots_adjust函数可以调整各个子图之间的间距和图像大小。它的定义如下:
subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
附上例子:
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2,2,sharex=True, sharey=True) # 子图为2行2列,设置子图具有相同的x轴和y轴
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) # 将子图之间的间距收缩到了0
设置操作 | axis内部函数 |
---|---|
设置刻度 | set_xticks([ticks_list])或者set_yticks([ticks_list]) |
设置刻度的描述文字 | set_xticklabels([ticks_label_list])或者set_yticklabels([ticks_label_list]) |
设置标题 | set_title('title_string') |
设置坐标轴文字 | set_xlabel('xlabel_string')或者set_ylabel('ylabel_string') |
设置图例 | plt.legend(loc='best') |
(4)设置刻度、标签和图例
这几个操作都需要调用axis对象的相关函数实现:
设置操作 | axis内部函数 |
---|---|
设置刻度 | set_xticks([ticks_list])或者set_yticks([ticks_list]) |
设置刻度的描述文字 | set_xticklabels([ticks_label_list])或者set_yticklabels([ticks_label_list]) |
设置标题 | set_title('title_string') |
设置坐标轴文字 | set_xlabel('xlabel_string')或者set_ylabel('ylabel_string') |
设置图例 | plt.legend(loc='best') |
(5)保存图像
用plt.savefig()可以保存图像。
plt.savefig('test.png', bbox_inches='tight')
示例代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig = plt.figure(1)
ax = fig.add_subplot(1,1,1)
data_one = np.random.randn(500).cumsum()
data_two = np.random.randn(500).cumsum()
data_three = np.random.randn(500).cumsum()
time = pd.date_range('2007-01-28', periods=500, freq='D')
ax.plot(time, data_one,'r--', label='red')
ax.plot(time, data_two, 'b.', label='blue')
ax.plot(time, data_three, 'k-', drawstyle='steps-post', label='steps-post')
ticks = ax.set_xticks(['2007-01-28', '2007-10-01', '2008-03-01'])
labels = ax.set_xticklabels(['zero', 'one','two'])
ax.set_title('test of multi-linestyles and xticks')
plt.legend(loc='best')
数据分析中的常用图形:
- 线型图:
除了matplotlib, pandas的Series和DataFrame都具有许多根据其自身数据组织特点来创建标准绘图的高级绘图方法。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
s=Series(np.random.randn(100), index=np.arange(0,100))
s.plot()
df=DataFrame(np.random.randn(10,4).cumsum(0), columns=['A','B','C','D'], index=np.arange(0,100,10))
df.plot()
- 柱形图:
柱状图绘制的是x坐标对应的y取值,在plot代码中加入kind=‘bar’就可以得到垂直柱状图,‘barh’则是水平柱状图。 - 直方图:
直方图histogram是一种可以对值的频率进行离散化显示的柱状图。可以通过调用Series或者DataFrame的hist函数得到。数据点被分割到离散的,间隔均匀的面元中,绘制的是各个面元中数据点的数量。其中参数bins表示面元的单位,可以用normed设置是否进行归一化。 - 密度图:
密度图经常和直方图绘制在一起。它是通过计算可能会产生观测数据的连续概率分布的估计产生的。密度图也被称为KDE(kernel density estimate,核密度估计)。调用plot时在kind设置为‘kde’就可以生成密度图。 - 散布图:
散布图是观察两个一维数据序列之间关系的有效手段。散布图也被成为散布图矩阵,它还支持在对角线上放置各个序列的直方图或者密度图。
附上代码:
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import numpy as np
comp1 = np.random.normal(0,1,size=200)
comp2 = np.random.normal(10,2,size=200)
values = Series(np.concatenate([comp1, comp2]))
data = Series(np.random.rand(16), index=list('abcdefghijklmnop'))
combined = {'comp1':comp1, 'comp2':comp2}
pd_combined = DataFrame(combined)
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
values.hist(bins=100, alpha=0.3, color='k', normed=True)
values.plot(kind='kde',style='k--')
ax2 = fig.add_subplot(2,1,2)
plt.scatter(comp1,comp2)
fig1, axes1 = plt.subplots(2,1)
data.plot(kind='bar', ax=axes1[0], color='k', alpha=0.7)
data.plot(kind='barh', ax=axes1[1], color='b', alpha=0.7)
pd_combined = DataFrame(combined)
pd.scatter_matrix(pd_combined, diagonal='kde')
pd.scatter_matrix(pd_combined, diagonal='hist')
柱状图:
图中(上)是直方图和密度图, (下)是散点图:
散布图, 对角线是数据的密度图:
散布图, 对角线是直方图: