python学习笔记38:matplotlib

import matplotlib.pyplot as plt
import numpy as np
# %matplotlib notebook
# from IPython import display
# %matplotlib inline

1 通过figure创建画布

# 简单实例
data = np.random.randn(100).cumsum()   # 标准正态分布100样本值,在累计求合
plt.plot(data)
plt.show()

png

# 创建空白画布,返回figure实例
plt.figure(num=1, figsize=(10,10),dpi=200,facecolor='gray',edgecolor='r')
<Figure size 2000x2000 with 0 Axes>




<Figure size 2000x2000 with 0 Axes>
  • num=None, 图编号
  • figsize=None, 图大小
  • dpi=None, 图分辨率
  • facecolor=None, 背景颜色
  • edgecolor=None, 边框颜色
plt.plot(data)  # 没有什么变化,没明白怎么回事
plt.show()

png

2 通过subplot创建单个子图

data = np.random.randn(10).cumsum()
plt.subplot(221)  # 把画布分成4份,在第一份上画图221等同于2,2,1
plt.plot(data)

plt.subplot(222)
plt.plot(data)

plt.subplot(212) # 把画布分成2份,在第二份上画图
plt.plot(data)
[<matplotlib.lines.Line2D at 0x119fcbe80>]

3 通过subplots创建多个子图

# 在notebook上这里有坑,所有代码要写在一个cell里面才能显示图片出来,不能拆开
fig,axes = plt.subplots(1,2)
data = np.random.randn(20).cumsum()
axes[0].plot(data,'g--')
axes[1].plot(data**2,'ko--')
plt.show()

4 通过add_subplot添加和选中子图

fig = plt.figure()
fig.add_subplot(1,2,1)
fig.add_subplot(1,2,2)
plt.plot(data)
plt.show()

5 添加各类标签

除图例要最后放之外,其他无先后顺序

  • title() 标题
  • xlabel() x 轴名称
  • ylabel() y 轴名称
  • xticks() x 轴刻度数目及取值
  • xlim() x轴取值范围
  • legend() 图例
plt.plot(data)
plt.title('demo')
plt.xlabel('x轴')
plt.xticks([0,10,20])
plt.legend('x=y')
plt.show()

# 上图中x轴有中文没有正常显示
from  matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Arial Unicode MS']

plt.plot(data)
plt.title('demo')
plt.xlabel('x轴')
plt.xticks([0,10,20])
plt.legend('x=y')
plt.show()

6 常见图表

  • plt.bar 条形图
  • plt.barh 水平条形图
  • plt.hist 直方图
  • plt.pie 饼图
  • plt.scatter 散点图
  • plt.plot 折线图
  • plt.boxplot 箱像图
  • plt.stackplot 堆积图
# 直方图
# 直方图(Histogram)是一种可视化在连续间隔,或者是特定时间段内数据分布情况的图表,经常被用在统计学领域。
# 简单来说,直方图描述的是一组数据的频次分布,例如把年龄分成“0-5,5-10,……,80-85”17个组,统计一下中国人口年龄的分布情况。
# 直方图有助于我们知道数据的分布情况,诸如众数、中位数的大致位置、数据是否存在缺口或者异常值
data = np.random.randint(0,100,100)
plt.hist(data, 
         bins=8,  # 条柱的个数
         color='g',
        alpha=0.5)  # 透明度
(array([11.,  6., 19., 12., 13., 17., 13.,  9.]),
 array([ 0.  , 12.25, 24.5 , 36.75, 49.  , 61.25, 73.5 , 85.75, 98.  ]),
 <a list of 8 Patch objects>)

# 柱状图
x = np.arange(5)
y1, y2 = np.random.randint(1,31,size=(2,5))
width = 0.25
ax = plt.subplot(1,1,1)
ax.bar(x,y1,width,color='b')
ax.bar(x+width,y2,width,color='r')
ax.set_xticks(x+width)
ax.set_xticklabels(['a','b','c','d','e'])
plt.show()

  • 直方图展示数据的分布,柱状图比较数据的大小
  • 直方图x轴为定量数据,柱状图x轴为分类数据

参考链接:能分清直方图和柱状图,你就是图表届的“头号”玩家

color

  • b 蓝 g绿 r红 c青 y黄 k黑 w白

marker

  • o 实心圆圈 D菱 h六边形 .点 s正方形

linestyle

  • -实线 --长虚线 -.短点相间线 :短虚线

7 本地保存图形

# savefig()
data = np.random.randn(100)
plt.plot(data)
plt.savefig('zxt.png')  # 要先保存在show(),否则是一张空图
plt.show()

8 seaborn 绘制统计图形

# diplot 单变量分布绘制函数
# jointplot 双变量分布绘制函数
import seaborn  as sns
import numpy as np
import pandas as pd
sns.set()  # 显示调用,获取默认绘图
np.random.seed(0)    # 确定随机种子,保证每次执行生成的数字时一样的
arr = np.random.randn(100)  # 标准正态分布的100个样本值
ax = sns.distplot(arr,bins=10) # 默认绘制核密度函数,方便查看数据分布情况,参数kde=True控制

df_obj = pd.DataFrame({"x": np.random.randn(100),
                      "y": np.random.randn(100)})
sns.jointplot(x="x",y="y",kind='scatter',data=df_obj) # 参数ratio来设置中心图与侧边图的大小比,默认为5
<seaborn.axisgrid.JointGrid at 0x1a1b0f5c18>

# 二维直方图
sns.jointplot(x="x",y="y",kind='hex',data=df_obj) 
<seaborn.axisgrid.JointGrid at 0x1a1aefe400>

# 核密度图
sns.jointplot(x="x",y='y',data=df_obj,kind='kde')
<seaborn.axisgrid.JointGrid at 0x1a1bfcb390>

# sns.pairplot 绘制数据集与变量之间的关系
data = sns.load_dataset("tips")
sns.pairplot(data)
<seaborn.axisgrid.PairGrid at 0x1a1c24ef98>

# 用分类数据来绘图
# sns.swarmplot() sns.stripplot() 分类散点图
# sns.boxenplot() sns.violinplot 分布图
# sns.barplot sns.pointplot 统计估计图
sns.stripplot(x='day',y='total_bill',data=data)  # 参数jitter 来控制数据展示
<matplotlib.axes._subplots.AxesSubplot at 0x1a1d2a1630>

sns.swarmplot(x='day',y='total_bill',data=data) # 数据不会重叠
<matplotlib.axes._subplots.AxesSubplot at 0x1a1cfa1470>

sns.boxenplot(x='day',y='total_bill',data=data)
<matplotlib.axes._subplots.AxesSubplot at 0x1a1cf6d278>

sns.violinplot(x='day',y='total_bill',data=data)
<matplotlib.axes._subplots.AxesSubplot at 0x1a1b1a7b00>


posted @ 2019-09-03 15:53  zheng1076  阅读(1138)  评论(0编辑  收藏  举报