Skip to main content

数据可视

matplotlib:支持十多种常见图表的绘制,一站式搞定数据可视化。

pyecharts:基于 echarts.js 的图表库,支持十几种常见图表的绘制,支持主流的 Python Web 框架,如 Flask、Django 等。

matplotlib

二维直线图

import numpy as np
from matplotlib import pyplot as plt
# 生成一个-3到3的等差数列,共100个数
a = np.linspace(-3, 3, 10)

# 三角函数
b = np.sin(a)
plt.plot(a, b)
# 等价于 plt.plot(b)
plt.show() # 正弦图

绘制多条数据线

# 画出多条数据线:
plt.plot(a, np.sin(a))
plt.plot(a, np.sin(2 * a))
plt.show()

线条修饰

# 使用字符串,给定线条参数:
# b:蓝色
# -- : 虚线
# o : 圆点
'''
完整参数可参考
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot
'''
plt.plot(a, np.sin(a), 'b--o')
plt.show()

散点图

plt.plot(a, np.sin(a), 'bo')
plt.show() # 二维散点图
# 等价于
plt.scatter(a, np.sin(a),color='blue',marker='o')
plt.show()
t = np.linspace(0, 2 * np.pi, 50)
x = np.sin(t)
plt.plot(t, x, 'bo', t, np.sin(2 * t), 'r-^', label='sin', color='red', )
plt.legend()
plt.xlabel('radians')
plt.ylabel('amplitude', fontsize='large')
plt.title('Sin(x)')
plt.grid()
plt.show()
# 直方图
data = np.array([1234, 321, 400, 120, 11, 30, 2000])
plt.hist(data, 7)
plt.show()

绘制三维数据

# 高维 RBF 插值
# 三维数据点:
import numpy as np
from matplotlib import pyplot as plt
x, y = np.mgrid[-np.pi / 2:np.pi / 2:5j, -np.pi / 2:np.pi / 2:5j]
z = np.cos(np.sqrt(x ** 2 + y ** 2))
fig = plt.figure(figsize=(12, 6))
ax = fig.add_subplot(projection='3d')
ax.scatter(x, y, z)
fig.savefig("mplot3d.jpg")
plt.show()

直方图

import numpy as np
from matplotlib import pyplot as plt
# 正态分布
from scipy.stats import norm
x_norm = norm.rvs(size=500)
x_norm.shape

plt.ion() #开启interactive mode

h = plt.hist(x_norm)
print('counts, ', h[0])
print('bin centers', h[1])
figure = plt.figure(1) # 创建图表1
plt.show()

归一化直方图(用出现频率代替次数),将划分区间变为 20(默认 10):

h = plt.hist(x_norm, bins=20)
plt.show()

多组直方图

from scipy.stats import norm
from scipy.stats import ttest_ind

# 独立样本 t 检验
# 两组参数不同的正态分布:
n1 = norm(loc=0.3, scale=1.0)
n2 = norm(loc=0, scale=1.0)

# 从分布中产生两组随机样本:
n1_samples = n1.rvs(size=100)
n2_samples = n2.rvs(size=100)

# 将两组样本混合在一起:
samples = np.hstack((n1_samples, n2_samples))

# 最大似然参数估计:
loc, scale = norm.fit(samples)
n = norm(loc=loc, scale=scale)

# 比较:
x = np.linspace(-3, 3, 100)

plt.hist([samples, n1_samples, n2_samples])
plt.plot(x, n.pdf(x), 'b-')
plt.plot(x, n1.pdf(x), 'g-')
plt.plot(x, n2.pdf(x), 'r-')
plt.show()

离散分布

# 离散分布
from scipy.stats import randint

# 离散均匀分布的概率质量函数(PMF):
high = 10
low = -10

x = np.arange(low, high + 1, 0.5)
p = plt.stem(x, randint(low, high).pmf(x)) # 杆状图
plt.show()

图内填充

from scipy.integrate import trapz

x1 = np.linspace(-2, 2, 108)
p = trapz(norm.pdf(x1), x1)
print('{:.2%} of the values lie between -2 and 2'.format(p))

plt.fill_between(x1, norm.pdf(x1), color='red')
plt.plot(x, norm.pdf(x), 'k-')
plt.show()

pyecharts

绘制柱状堆叠图


'''
绘制柱状堆叠图
'''

from pyecharts import options as opts#导入模块
from pyecharts.charts import Bar

x_attr = ["2018", "2019", "2020", "2021"] #x轴
data1 = [2.691, 4.282, 12.88, 11.43] #第1季度
data2 = [9.157, 9.028, 11.46,9.507]#第2季度
data3 = [4.282, 9.484, 11.91, 16.97]#第3季度
data4 = [16.72, 22.46,26.85, 0]#第4季度

bar=(
Bar()
.add_xaxis(x_attr) #设置x轴
.add_yaxis("第1季度", data1, stack="stack1") #叠加Y轴:数据名称、数据、是否叠加
.add_yaxis("第2季度", data2, stack="stack1") #叠加Y轴:数据名称、数据、是否叠加
.add_yaxis("第3季度", data3, stack="stack1") #叠加Y轴:数据名称、数据、是否叠加
.add_yaxis("第4季度", data4, stack="stack1") #叠加Y轴:数据名称、数据、是否叠加
.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) #是否直接显示数值:否
.set_global_opts(title_opts=opts.TitleOpts(title="宁德时代扣非净利润季度报表",
subtitle="2017-2021年"))#主标题,副标题
)

bar.render_notebook()

绘制优雅的双轴折线图

'''
pyecharts绘制优雅的双轴折线图
'''

import pyecharts.options as opts #导入模块
from pyecharts.charts import Line #导入模块

# 设置坐标轴

x_data = ["1999-1", "1999-2", "2000", "2003", "2009", "2010", "2020"]
y_data = [820, 932, 1901, 934, 1290, 330, 1320]
y2_data = [0.1, 0.1, 0.3, 0.5, 0.1, 0.1, 0.1]

# 设外层括号是为了让代码可以换行不报错,看起来更美观

line = (
Line() #定义图表类型为折线Line
.set_global_opts( #固定参数,设置全局属性
tooltip_opts=opts.TooltipOpts(is_show=False),
#这句的意思是: 提示框设置(是否展示 = 否)

# 坐标轴类型。可选:
# 'value': 数值轴,适用于连续数据。
# 'category': 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。
# 'time': 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,
# 例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。
# 'log' 对数轴。适用于对数数据。

#设置X轴为类目,一般都是用它
xaxis_opts=opts.AxisOpts(type_="category"),

#设置X轴为数值轴,一般都是用它
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True), #鼠标放在点点上展示数值
splitline_opts=opts.SplitLineOpts(is_show=True), #背景加参考线
),
)
.add_xaxis(xaxis_data=x_data) #添加x轴数据

#添加主坐标轴(左边的)
.add_yaxis(
series_name="盈利率", #设置折线的标签名
y_axis=y_data, #添加y轴数据
symbol="emptyCircle", #设置折线图中表示每个坐标点的符号,emptyCircle代表空心圆
label_opts=opts.LabelOpts(is_show=True), #显示折线上的数据
)

#添加副坐标轴(右边的)固定格式,extend是增加,axis是轴
.extend_axis(
yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}")))
)
# 画第2条线,参数重复,不再多讲啦-
line2 =(Line()
.add_xaxis(x_data)
.add_yaxis("换手率",y2_data, yaxis_index=1))

line.overlap(line2) #叠加
line.render_notebook()