视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python数据可视化编程实践-绘制图表
2025-10-02 19:21:12 责编:小OO
文档
Python数据可视化编程实践-绘制图表

准备工作

打开Jupyter Notebook,导入需要的包,并配置好图片交互和中文显示环境:

import pandas as pd

import numpy as np

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

import matplotlib as mpl

import matplotlib.pyplot as plt

import matplotlib.cm as cm

%matplotlib inline

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

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

定义图表类型——柱状图、线形图和堆积柱状图

调用figure()方法,创建一个新的图表,接下来的绘图操作都在此图表中进行,参数figsize=(12,6)表示该图表的大小。

调用subplot(231)方法把图表分割成2行3列的网格,1表示图形的标号。

x = [1, 2, 3, 4]

y =[5, 4, 3, 2]

plt.figure(figsize=(12,6))

plt.subplot(231)

plt.plot(x,y) # 折线图

plt.subplot(232)

plt.bar(x,y) # 垂直柱状图

plt.subplot(233)

plt.barh(x,y) # 水平柱状图

plt.subplot(234)

plt.bar(x,y)

y1= [7,8,5,3]

plt.bar(x,y1,bottom=y,color='r') # 堆叠柱状图 设置参数bottom=y

plt.subplot(235)

plt.boxplot(x) # 箱线图

plt.subplot(236)

plt.scatter(x,y) # 散点图

plt.show()

具体解释下箱线图中的几个最重要的显示选项。

首先,我们可以添加从箱体延伸出来的箱须来展示数据集合的整个范围。箱体和箱须主要用于表现一个或多个数据集合中数据的编号,容易对数据进行对比而且易于理解。在同一个箱线图中可以呈现5种数据。

最小值:数据集合的最小值。

第二四分位数:其以下为数据集合中较低的25%数据。

中值:数据集合的中值

第三四分位数:其以上为数据集合中较高的25%数据。

最大值:给定数据集合的最大值。

dataset = [113, 115, 119, 121, 124,

124, 125, 126, 126, 126,

127, 127, 128, 129, 130,

130, 131, 132, 133, 136]

plt.figure(figsize=(10,6))

plt.subplot(121)

plt.boxplot(dataset, vert = False)

plt.subplot(122)

plt.hist(dataset)

plt.show()

我们用同一个数据集合来绘制箱线图和直方图,观察两种图表在数据展现上的差异。左图呈现了五个统计数据,右图展示了数据集合在给定范围内的分组情况。

简单的正弦图和余弦图

我们对从-Pi到Pi之间具有相同线性距离的256个点来计算正弦值和余弦值,然后把sin(x)值和cos(x)值在用以图表中绘制出来。

x = np.linspace(-np.pi, np.pi, 256, endpoint=True)

y = np.cos(x)

y1 = np.sin(x)

plt.figure(figsize=(10,6))

plt.plot(x, y)

plt.plot(x, y1)

plt.title("Functions $\\sin$ and $\\cos$") #设置图标题

plt.xlim(-3.0, 3.0) #设置x轴范围

plt.ylim(-1.0, 1.0) #设置y轴范围

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],

[r'$-\\pi$', r'$-\\pi/2$', r'$0$', r'$+\\pi/2$', r'$+\\pi$']) # 用希腊字母标注x轴标签

plt.yticks([-1, 0, +1],

[r'$-1$', r'$0$', r'$+1$'])

plt.show()

设置坐标轴长度和范围

如果不实用axis()或者其他参数设置,matplotlib会自动使用最小值,刚好可以让我们在一个图中看到所有的数据点。调用autoscale()方法,会以坐标轴的最佳大小适应数据的显示。

axis()里面的值分别表示坐标轴上xmin、xmax、ymin、ymax

axhline()表示绘制了一条y=0的水平线

axvline()表示绘制了一条x=0的垂直线

axhline(4)表示绘制了一条y=4的水平线

l=[-1, 1, -10, 10]

plt.axis(l)

plt.axhline()

plt.axvline()

plt.axhline(4)

设置图表的线型、属性和格式化字符串

常见的线条样式:

- 直线

--虚线

-. -.形式

: 细小虚线

常见的点样式:

s--方形

h--六角形

H--六角形

*--星号

+--加好

x--x型

d--菱形

D--菱形

p--五角形

常见的颜色样式:

c-cyan--青色

r-red--红色

m-magente--品红

g-green--绿色

b-blue--蓝色

y-yellow--黄色

k-black--黑色

w-white--白色

# plot(x轴数据,y轴数据,展现形式)

x = [1, 2, 3, 4, 8]

y = [5, 7, 2, 1, 5]

plt.plot(x, y, '-', color='g', linewidth=0.8)

plt.plot(x, y,'*',color='r') #散点图

plt.show()

设置刻度、刻度标签和网格

刻度是图形的一部分,由刻度定位器(指定刻度所在的位置)和刻度格式器(指定刻度显示的样式)组成。刻度有主刻度和次刻度,默认次刻度不显示。

locator_params()方法控制刻度定位器,可以控制刻度的数目。

plt.figure(figsize=(10,6))

# 获取当前坐标

ax = plt.gca()

# 设置紧凑视图,设置刻度间隔最大为10

ax.locator_params(tight=True, nbins = 10)

# 生成100个正态分布值

ax.plot(np.random.normal(10, .1, 100))

plt.show()

使用dates模块的一个例子来说明刻度格式器的配置。刻度格式器规定了值的显示方式。

import datetime

fig = plt.figure(figsize=(10,6))

# 获取当前的坐标轴

ax = plt.gca()

# 设置一些日期区间

start = datetime.datetime(2013, 01, 01)

stop = datetime.datetime(2013, 12, 31)

delta = datetime.timedelta(days = 1)

# 转换日期

dates = mpl.dates.drange(start, stop, delta)

# 产生一些随机值

values = np.random.rand(len(dates))

ax = plt.gca()

# 用日期值画图

ax.plot_date(dates, values, linestyle='-', marker='')

# 指定格式

date_format = mpl.dates.DateFormatter('%Y-%m-%d')

# 应用格式

ax.xaxis.set_major_formatter(date_format)

# 自动格式日期标签

fig.autofmt_xdate()

plt.show()

添加图例和注解

图例和注解清洗连贯地解释了数据图表的内容。通过给给个plot添加一个关于所显示数据的简短描述,能让观察者更容易理解。

在每个plot中指定了一个字符串标签(label),这样legend()会把它们添加到图例框中。通过loc参数确定图例框的位置。

annotate()可以为xy坐标位置的数据点添加字符串描述。通过设置xycoord='data',可以指定注解和数据使用相同的坐标系,注解文本的起始位置通过xytext指定。

箭头由xytext指向xy坐标位置。arrowstyle指定了箭头风格。

plt.figure(figsize=(10, 6))

# 生成不同正态分布值

x1 = np.random.normal(30, 3, 100)

x2 = np.random.normal(20, 2, 100)

x3 = np.random.normal(10, 3, 100)

# 在同张画布里画3条线

plt.plot(x1, label='plot')

plt.plot(x2, label='2nd plot')

plt.plot(x3, label='3nd plot')

# 生成图例框

plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=3, mode="expand", borderaxespad=0.)

# 注解重要值

plt.annotate("Important value:(55, 20)", (55, 20), xycoords='data', xytext=(5, 38), arrowprops=dict(arrowstyle='->'))

plt.show()

移动轴线到图

轴线定义了数据区域的边界,把坐标轴刻度标记连接起来。一共有四个轴线,可以把它们放置在任何位置。默认情况下,它们被放置在坐标轴的边界。

为了把轴线移到图,需要把其中两个轴线隐藏起来(设置color为none)。然后,移动另外两个到坐标(0,0)。坐标为数据空间坐标。

x = np.linspace(-np.pi, np.pi, 500, endpoint=True)

y = np.sin(x)

plt.plot(x, y)

ax = plt.gca()

ax.spines['right'].set_color('none') # 隐藏右边的轴线

ax.spines['top'].set_color('none') # 隐藏顶端的轴线

ax.spines['bottom'].set_position(('data', 0)) # 移动底端的轴线到(0,0)

ax.spines['left'].set_position(('data', 0)) # 移动左端的轴线到(0,0)

ax.xaxis.set_ticks_position('bottom') # 移动底端的刻度到x轴

ax.yaxis.set_ticks_position('left') # 移动左侧的刻度到x轴

plt.show()

绘制直方图

直方图被用于可视化数据的分布估计。表示一定间隔下数据点频率的垂直矩阵称为bin。bin以固定的间隔创建,因此直方图的总面积等于数据点的数量。

直方图可以显示数据的相对频率,而不是使用数据的绝对值。在这种情况下,总面积等于1。

mu = 100

sigma = 15

x = np.random.normal(mu, sigma, 10000)

ax = plt.gca()

ax.hist(x, bins=35, color='r', normed=True) # normed=True ,直方图的值将进行归一化处理,形成概率密度。默认值为False

ax.set_xlabel('值')

ax.set_ylabel('频率')

ax.set_title(r'$\\mathrm{Histogram:}\\ \\mu=%d,\\ \\sigma=%d$' % (mu, sigma))

plt.show()

绘制误差条形图

误差条可以用来可视化数据集中的测量不确定度或者指出错误。

经常使用到的参数:

xerr和yerr:用于在柱状图上生成误差条。

width:给定误差条的宽度,默认值是0.8.

bottom:如果指定了bottom,其值会加到高度中,默认值为None。

edgecolor:给定误差条边界颜色。

ecolor:指定误差条的颜色。

linewidth:误差条边界宽度,可以设为None(默认值)和0(此时误差条边界将不显示出来)

orientation:有vertical和horizontal两个值。

x = np.arange(0, 10, 1)

y = np.log(x)

xe = 0.1 * np.abs(np.random.randn(len(y)))

plt.bar(x, y, yerr=xe, width=0.4, align='center', ecolor='r', color='cyan', label='experiment #1')

plt.xlabel('# measurement')

plt.ylabel('Measured values')

plt.title('Measurements')

plt.legend(loc='upper left')

plt.show()

绘制饼图

饼图显示的数据集合加起来必须等于100%,否则它就是无意义的、无效的。

饼图描述数值的比例关系,其中每个扇区的弧长大小为其所表示的数量的比例。

饼图的缺点:

1.难以对数量进行比较。

2.以特定角度的方式和一定颜色的扇形展示数据,会使我们的感觉有倾向性,从而影响我们对于所呈现数据得到的结论。

plt.figure(figsize=(6, 6))

ax = plt.axes([0.1, 0.1, 0.8, 0.8])

labels = 'Spring', 'Summer', 'Autumn', 'Winter'

# 饼图的每部分定义为x/sum(x),或者为x if sum(x)<=1

x = [15, 30, 45, 10]

# 给定一个序列,每一个元素表示每个圆弧间偏移量,为半径的百分比

explode = (0.1, 0.1, 0.1, 0.1)

# 如果没有指定startangle,扇区将从x轴开始逆时针排列,如果指定的值为90,饼图将从y轴开始

# autpct参数用来格式化绘制在圆弧中的标签

plt.pie(x, explode=explode, labels=labels, autopct='%1.1f%%', startangle=67)

plt.title('Rainy days by season')

plt.show()

绘制带填充区域的图表

对曲线间或者曲线下面的区域填充颜色,这对我们理解给定的特定信息是非常有必要的。

x = np.arange(0.0, 2, 0.01)

y1 = np.sin(2*np.pi*x)

y2 = 1.2*np.sin(4*np.pi*x)

fig = plt.figure(figsize=(10, 6))

ax = plt.gca()

# 绘制出两个信号的图形

ax.plot(x, y1, x, y2, color='black')

# fill_between()方法使用x为定位点选取y值(y1,y2),用where参数指定条件来填充曲线,where参数接手布尔值(可以是表达式)

ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='darkblue', interpolate=True)

ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='deeppink', interpolate=True)

ax.set_title('filled between')

plt.show()

绘制带彩色标记的散点图

散点图显示两组数据的值。散点图可以作为更高级的数据可视化的基础,比如绘制散点图矩阵。

散点图通常在应用拟合回归之前绘制,用来识别两个变量间的关联。

x = np.random.randn(1000)

# y1为随机值,与x不相关

y1 = np.random.randn(len(x))

# y2与x强相关

y2 = 1.2 + np.exp(x)

fig = plt.figure(figsize=(10, 6))

ax1 = plt.subplot(121)

# marker参数用来设置点状标记(默认为circle),alpha参数表示透明度,edgecolors参数表示标记的边界颜色,label参数用于图例框

plt.scatter(x, y1, color='indigo', alpha=0.3, edgecolors='white', label='no correl')

plt.xlabel('no correlation')

plt.grid(True)

plt.legend()

ax2 = plt.subplot(122, sharey=ax1, sharex=ax1)

plt.scatter(x, y2, color='green', alpha=0.3, edgecolor='grey', label='correl')

plt.xlabel('strong correlation')

plt.grid(True)

plt.legend()

plt.show()下载本文

显示全文
专题