python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python可视化图表

Python中八种常用的可视化图表绘制完整代码

作者:Li Ming&

数据可视化是数据分析中不可或缺的一环,而Matplotlib是Python生态中最基础、最强大的绘图库,本文基于一段典型的可视化代码,带您逐行拆解8种常用图表的绘制方法,希望对大家有所帮助

前言

数据可视化是数据分析中不可或缺的一环,而Matplotlib是Python生态中最基础、最强大的绘图库。本文基于一段典型的可视化代码,带您逐行拆解8种常用图表的绘制方法,包括:

一、环境准备与通用设置

安装依赖

pip install matplotlib numpy

中文字体与负号显示

Matplotlib默认不支持中文,需设置字体,并解决负号显示为方块的问题:

plt.rcParams["font.sans-serif"] = ["SimHei"]   # 使用黑体
plt.rcParams["axes.unicode_minus"] = False    # 正常显示负号

二、效果展示

三、完整代码

# -*- coding: utf-8 -*-
# 安装所需模块 
# pip install matplotlib
# pip install numpy
'''Python绘制八种可视化常用的图表'''
import numpy as np
import matplotlib.pyplot as plt
import random
from mpl_toolkits.mplot3d import Axes3D
'''折线图绘制'''
x_data = ['职场','美食','摄影','情感','艺术','影视','穿搭','绘画','搞笑','游戏','动漫','音乐']
x = np.linspace(1, 2, 100)
for i in range(len(x_data)):
	plt.plot(x, x**(i+1), label=x_data[i])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 设置x轴标签名
plt.xlabel('笔记分类')
# 设置y轴标签名
plt.ylabel('关注度')
# 设置图片名称
plt.title("折线图绘制")
plt.legend()
plt.show()
''' 柱形图绘制 '''
x_data = ['职场','美食','摄影','情感','艺术','影视','穿搭','绘画','搞笑','游戏','动漫','音乐']
y_data = [963,344,107,236,587,312,1263,963,105,453,363,163]
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
for i in range(len(x_data)):
    plt.bar(x_data[i], y_data[i])
    plt.text(x_data[i], y_data[i], y_data[i], ha="center", va="bottom", fontsize=12)
# 设置图片名称
plt.title("柱形图绘制")
# 设置x轴标签名
plt.xlabel("笔记分类")
# 设置y轴标签名
plt.ylabel("关注度")
plt.show()
''' 并列柱状图绘制 '''
size = 5
# 返回size个0-1的随机数
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
# x轴坐标, size=5, 返回[0, 1, 2, 3, 4]
x = np.arange(size)
# 有a/b/c三种类型的数据,n设置为3
total_width, n = 0.8, 3
# 每种类型的柱状图宽度
width = total_width / n
# 重新设置x轴的坐标
x = x - (total_width - width) / 2
# 画柱状图
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.bar(x, a, width=width, label="a")
plt.bar(x + width, b, width=width, label="b")
plt.bar(x + 2*width, c, width=width, label="c")
# 功能1
x_labels = ["第1组", "第2组", "第3组", "第4组", "第5组"]
# 用第1组...替换横坐标x的值
plt.xticks(x, x_labels)
# 功能2
for i, j in zip(x, a):
    plt.text(i, j + 0.01, "%.2f" % j, ha="center", va="bottom", fontsize=12)
for i, j in zip(x + width, b):
    plt.text(i, j + 0.01, "%.2f" % j, ha="center", va="bottom", fontsize=12)
for i, j in zip(x + 2 * width, c):
    plt.text(i, j + 0.01, "%.2f" % j, ha="center", va="bottom", fontsize=12)
# 显示图例
plt.legend()
# 显示柱状图
plt.title("并列柱状图绘制")
plt.show()
''' 饼图绘制 '''
x_data = ['职场','美食','摄影','情感','艺术','影视','穿搭','绘画','搞笑','游戏','动漫','音乐']
y_data = [963,344,107,236,587,312,1263,963,105,453,363,163]
explode = [0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0]
# 设置图片名称
plt.title('饼图绘制')
# 画饼图方法
plt.pie(y_data,explode=explode,labels=x_data,shadow=True,autopct='%1.1f%%')
# 显示
plt.show()
'''直方图绘制'''
np.random.seed(19680801)
mu1, sigma1 = 100, 15
mu2, sigma2 = 80, 15
x1 = mu1 + sigma1 * np.random.randn(10000)
x2 = mu2 + sigma2 * np.random.randn(10000)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# density:是密度而不是具体数值
n1, bins1, patches1 = plt.hist(x1, 50, density=True, facecolor='g', alpha=1)
n2, bins2, patches2 = plt.hist(x2, 50, density=True, facecolor='r', alpha=0.2)
plt.xlabel('X')
# 设置y轴标签名
plt.ylabel('Y')
# 设置图片名称
plt.title("直方图绘制")
plt.text(110, .025, r'$\mu=100,\ \sigma=15$')
plt.text(50, .025, r'$\mu=80,\ \sigma=15$')
# 设置x,y轴的具体范围
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
'''极轴饼图绘制'''
np.random.seed(19680801)
N = 10
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)
# left表示从哪开始,
# radii表示从中心点向边缘绘制的长度(半径)
# width表示末端的弧长
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 自定义颜色和不透明度
for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.viridis(r / 10.))
    bar.set_alpha(0.5)
# 设置图片名称
plt.title("极轴饼图绘制")
plt.show()
'''三维散点图绘制'''
data = np.random.randint(0, 255, size=[40, 40, 40])
x, y, z = data[0], data[1], data[2]
ax = plt.subplot(111, projection='3d')  # 创建一个三维的绘图工程
#  将数据点分成三部分画,在颜色上有区分度
ax.scatter(x[:10], y[:10], z[:10], c='y')  # 绘制数据点
ax.scatter(x[10:20], y[10:20], z[10:20], c='r')
ax.scatter(x[30:40], y[30:40], z[30:40], c='g')
ax.set_zlabel('Z')  # 坐标轴
ax.set_ylabel('Y')
ax.set_xlabel('X')
plt.title("三维散点图绘制")
plt.show()
'''三维平面图绘制'''
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 具体函数方法可用 help(function) 查看,如:help(ax.plot_surface)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.title("三维平面图绘制")
plt.show()

四、总结与建议

本文通过8个实例,覆盖了Matplotlib中最常用的图表类型。您可以根据实际数据特征选择合适图表:

图表类型适用场景
折线图趋势变化
柱形图数值对比
并列柱状图多组对比
饼图占比分布
直方图频率分布
极轴饼图环形/角度数据
三维散点图三维聚类
三维曲面图数学函数/地形可视化

以上就是Python中八种常用的可视化图表绘制完整代码的详细内容,更多关于Python可视化图表的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文