使用pandas制作图表

数据可视化对于数据分析的重要性不言而喻,一个优秀的图表有足以一眼就看出关键所在。pandas利用matplotlib实现绘图。能够提供各种各样的图表功能,包括:

  1. 单折线图
  2. 多折线图
  3. 柱状图
  4. 叠加柱状图
  5. 水平叠加柱状图
  6. 直方图
  7. 拆分直方图
  8. 箱型图
  9. 区域块图形
  10. 散点图
  11. 饼图
  12. 多子图
  13. 密度图
  14. 自由定制多子图

下面我们会依次讲解每一个图表的绘制,我们假设每一个代码文件里都引入了以下python包:

#!/usr/bin/env python
# -*-coding: UTF-8 -*-

import pandas as pd
import numpy as np
import MySQLdb
import random

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
1. 单折线图

直接指定X轴、Y轴的值生成二维图表,np.arange返回的类型是numpy.ndarray。通过plt.title能够指定图表标题,plt.xlabel指定X轴名称,plt.ylable指定Y轴名称。

示例

x = np.arange(1, 12)
print(type(x))

y = x ** 2 + 4
print(type(y))

plt.title("Matplotlib demo")
plt.xlabel("时间(分钟)")
plt.ylabel("金额($)")
plt.plot(x,y)
plt.show()

输出
在这里插入图片描述

2. 多折线图

示例

js = '''
{
    "index":["2020-09-01","2020-09-02","2020-09-03","2020-09-04"],
    "columns":["首页PV","搜索页PV","注册数","下单用户数","订单数"],
    "data":[
            [1, 2, 3, 4, 5],
            [3, 7, 8, null, 10],
            [5, null, 13, 14, 15],
            [7, null, 18, 19, 20]
     ]
}
'''

pv_conv = pd.read_json(js, orient='split')
pv_conv.plot()
plt.show()

输出
在这里插入图片描述

3. 柱状图

示例

data = np.random.rand(10, 4)
df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.bar()

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

4. 叠加柱状图

示例

data = np.random.rand(10, 4)
df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.bar(stacked=True)

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

5. 水平叠加柱状图

示例

data = np.random.rand(10, 4)
df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.barh(stacked=True)

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

6. 直方图

示例

df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), 'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
print(df)
df.plot.hist(bins=20)
plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

7. 拆分直方图

示例

df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), 'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
print(df)

df.hist(bins=20)

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

8. 箱型图

用于展示每列中值的分布

示例

df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
print(df)
df.plot.box()

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

9. 区域块图形

示例

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.area()

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

10. 散点图

参数说明

# x: 散点的x坐标位置
# y: 散点的y坐标位置
# s: 散点的大小
# c: 散点颜色
# 更多参数查看: help(df.plot.scatter)

df.plot(kind='scatter', x='A', y='B', s=df.C*500, c='r')
plt.show()

示例

df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
print(df)
df.plot.scatter(x='a', y='b')

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

11. 饼图

示例

df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
print(df)
df.plot.pie(subplots=True)

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

12. 多子图

参数说明

  • subplots: 默认False, 如果想要每列单独绘图,改为True
  • layout: 画布划分多少块,(x,y)表示x行y列,块数要大于列数
  • figsize: 整个画布大小
  • sharey: 指定是否共享Y周范围

示例

df = pd.DataFrame(np.random.randn(4, 9), index=['a', 'b', 'c', 'd'], columns=np.arange(2, 11))
print(df)

# df.plot(subplots=True, layout=(3, 3), figsize=(10, 10), kind='bar')
df.plot(subplots=True, layout=(3, 3), figsize=(10, 10), kind='bar', sharey=True)

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

13. 密度图

类直方图,能够预测趋势

示例


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sys
import MySQLdb
import random

import matplotlib.pyplot as plt
import scipy

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

pv_conv = {
    '首页PV': [985, 211, 688, 766],
    '搜索页PV': [290, 200, 201, 228],
    '注册数': [98, 21, 19, 71],
    '下单用户数': [46, 43, 68, 72],
    '订单数': [40, 50, 70, 80],
}

df = pd.DataFrame(pv_conv)
print(df)

df['首页PV'].plot.density()

plt.show()

数据
在这里插入图片描述

输出
在这里插入图片描述

14. 自由定制多子图

示例

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文标签
plt.rcParams['font.serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False

x = np.random.randn(100)
print(x)
fig, axes = plt.subplots(1, 4)
sns.kdeplot(x, ax=axes[0])
sns.kdeplot(x, ax=axes[1], cumulative=True)  # 累积分布
sns.kdeplot(x, ax=axes[2], shade=True)  # kde曲线下面的区域中进行阴影处理
sns.kdeplot(x, ax=axes[3], vertical=True)  # X轴进行绘制还是以Y轴进行绘制
plt.show()

输出
在这里插入图片描述

参考资料
  1. https://zhuanlan.zhihu.com/p/33977558

 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值