《利用python进行数据分析》第九章 绘图与可视化

2022-09-27 12:07:17

9.1简明matplotlib API入门

9.1.1图片与子图

  • matplotlib绘制的图位于图片(Figure)对象中,使用plot.figure生成一个新图
  • fig = plt.figure()#不会有任何显示,无法用空白的图片绘图
  • 需要使用add_subplot创建一个或者多个子图(subplot)
fig = plt.figure()
<matplotlib.figure.Figure at 0x19a8bfcdc18>

ax1 = fig.add_subplot(2,2,1)

ax2 = fig.add_subplot(2,2,2)

ax3 = fig.add_subplot(2,2,3)#返回的对象是Axes Subplot

plt.plot([1.5,3.5,-2,1.6])

plt.plot(np.random.randn(50).cumsum(),'k--')#'k--'确定划线的黑色线的风格,

  • matplotlib库中包含一个方法:plt.subplots(创建一个新的图片,然后返回包含了已经生成子图对象的Numpy数组)
fig, axes = plt.subplots(2, 3)
axes
out[19]array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d010311d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00f33400>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00edb940>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00f01eb8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00eb1470>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00e599e8>]],
      dtype=object)
表9-1. pyplot.subplots选项

9.1.1.1调整子图周围的间距

  • 默认情况下,matplotlib会在子图的外部和子图之间留出一定的间距,但可以利用GUI窗口调整图的大小
  • subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None)
  • #wspace,hspace分别控制图像的宽和高百分比
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)

9.1.2颜色,标记和线类型

  • ax.plot(x,y,'g--')#直接通过字符串指定颜色和线型
  • ax.plot(x,y,linestyle='--',color='g')
  • 折线图可以标记凸显实际的数据点
from numpy.random import randn
plt.plot(randn(30).cumsum(),'ko--')
#上面一句代码可以更加显示的写成:
#plot(randn(30).cumsum,color='k',linestyle='dashed',marker='o')

data = randn(30).cumsum()
plt.plot(data,'k--',label='Default')

plt.plot(data,'k-',drawstyle='steps-post',label='steps-post')

9.1.3刻度,标签和图例

  • 对于大多数的图表装饰项,主要实现方式有两种:使用过程型的pyplot接口(MATLAB)以及面向对象的原生matplotlib API
  • pyplot接口的设计目的就是交互式使用,含有诸如xlim,xticks,xticklabels之类的方法
  • 它们分别控制图表的范围,刻度位置,刻度标签,使用方法有两种:
  • 1,调用时不带参数,则返回当前的参数值:plt.xlim()返回当前X轴绘图范围
  • 2,调用时带参数,设置参数值,则,plt.xlim([0,10])会将X轴的范围设置为0,10

9.1.3.1设置标题,轴标签,刻度和刻度标签

  • 修改X轴的刻度,set_xticks(将刻度放在数据范围的哪些位置,默认刻度也是位置的标签)
  • set_xticklabels(将任何其他值用作标签)
fig = plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum())
ticks = ax.set_xticks([0,250,500,750,1000])
labels = ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small')
ax.set_title('My first matplotlib plot')
ax.set_xlabel('Stages')

9.1.3.2添加图例

  • 图例(legend)是另外一种用于标识图表元素的重要工具。
  • 添加subplot的时候传入label参数
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum(),'k',label='one')
ax.plot(randn(1000).cumsum(),'k--',label='two')
ax.plot(randn(1000).cumsum(),'k.',label='three')
ax.legend(loc='best')

9.1.4注释与子图加工

  • 想要在图表上添加自己的注释,注释中可能含有各种文本,箭头,图形
  • 可以使用text,arrow,annote来添加注释和文本
  • text在文本上给定的坐标(x,y),
  • ax.text(x,y,'hello,world',family='monospace',fontsize=10)

9.1.5将图片保存到文件

  • 利用plt.savefig可以将当前图表保存到文件,此方法相当于Figure对象的实例方法savefig
  • 例如,要将图表保存为SVG文件,只需输入:plt.savefig('figpath.svg')
  • 文件类型是通过文件的拓展名推荐出来的
  • 最常用到的两个重要的选项是dpi(控制“每英寸点数”分辨率)和box_inches(剪除当前图表周围的空白部分)
  • 比如,要得到一张最小白边且分辨率为400DPI的PNG图片:
  • plt.savefig('figpath.png',dpi=400,bbox_inches='tight')
  • savefig并非一定要写入磁盘,也可以写入任何文件型的对象,比如string10:
  • from io import BytesIO
    buffer=BytesIO
    plt.savefig(buffer)
    plot_data=buffer.getvalue()

9.1.6 matplotlib设置

  • 图片的大小,边距,配色方案,字体大小,网络类型都可以通过全局参数自定义
  • 操作matplotlib配置系统的方式有两种:
  • 第一种是python编程方式,rc方式,比如要将全局的图像默认大小设置为10*10
  • plt.rc('figure',figsize=(10,10))

9.2使用pandas和seaborn绘图

  • matplotlib是相当底层的工具,要组装一张图表,你得用它的各种组件才行
  • 数据展示:(图表的类型:线型图,柱状图,盒形图,散布图,等值线图),图例,标题,刻度标签等信息

9.2.1折线图

  • Series和DataFrame都有一个用于生成各类图标的plot方法,默认情况下plot()生成的是折线图
s = Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()#该serie的对象的索引会被传给matplotlib,并绘制X轴

  • pandas的大部分绘图方法都有一个可选的ax参数,他可以是一个matplotlib的subplot对象
  • DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例
import pandas as pd
df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),columns=['A', 'B', 'C', 'D'],index=np.arange(0, 100, 10))
df.plot()
简单的DataFrame的图的表示例

series.plot方法的参数
DataFrame的plot参数

9.2.2柱状图

  • plot.bar()和plot.barth()可以分别绘制垂直和水平的柱状图
  • 在绘制柱状图时,Series和DataFrame的索引将会被用作X或者Y的刻度
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)#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()

  • DataFrame各列的名称“Genus”被用作图例的标题,设置stacked=True
  • DataFrame生成堆积柱状图,这样每行的值就会被堆积在一起
df.plot.barh(stacked=True,alpha=0.5)


  • 对于在绘图前需要聚合或者汇总的数据,使用seaborn包会使得工作更为简单

9.2.3直方图和密度图

  • 直方图是一种可以对值频率进行离散化的柱状图
  • 数据点被拆分到离散的,间隔均匀的面元中,绘制的是各面元中数据点的数量
  • distplot方法可以绘制直方图和连续密度估计,通过distplot方法seaborn使直方图和密度图的绘制更为简单
  • 考虑由两个不同的标准正态分布组成的双峰分布:
comp1 = np.random.normal(0,1,size=200)
comp2 = np.random.normal(10,2,size=200)
values = pd.Series(np.concatenate([comp1,comp2]))
sns.distplot(values,bins=100,color='k')

9.2.4散点图或点图

  • 点图或者散点图用于检验两个一维数据序列之间的关系
  • seaborn的regplot方法,该方法可以绘制散点图,并拟合出一条线性回归线

9.2.5分面网格和分类数据

  • 如果数据集和额外的分组维数,使用分面网络是利用多种分组变量对数据进行可视化的方法
  • seaborn拥有一个有效的内建函数factorplot,它可以简化多种分面绘图
  • 作者:沙拉路酱
  • 原文链接:https://blog.csdn.net/lurong66/article/details/88310140
    更新时间:2022-09-27 12:07:17