python_matplotlib绘图

matplotlib学习

数据可视化

库的导入:import matplotlib.pyplot as plt

绘制折线图,并保存

(1)

import matplotlib.pyplot as plt

plt.plot([3, 1, 4, 5, 2])  # 默认为y轴坐标 x坐标默认为索引值

plt.ylabel("grade")

plt.savefig("test", dpi=600)  # 格式为PNG文件,图像名称为test,dpi表示每英寸包含的像素点个数

plt.show()

(2)

plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2])  # 依次为横纵坐标

plt.ylabel("Grade")  # y轴名称

plt.axis([-1, 10, 0, 6])  # 横纵坐标范围

plt.show()

pyplot绘图区域

plt.subplot(nrows, ncols, plot_number)

# pyplot绘图区域
import numpy as np
import matplotlib.pyplot as plt


def f(t):
    return np.exp(-t) * np.cos(2 * np.pi*t)


a = np.arange(0.0, 5.0, 0.02)
plt.subplot(2, 1, 1)  # 图像分区
plt.plot(a, f(a))

plt.subplot(2, 1, 2)  # 图像分区
plt.plot(a, np.cos(2*np.pi*a), "r--")
plt.show()

pyplot的plot()函数

plt.plot(x, y, format_string, **kwargs)

x: x轴数据,列表或数组,可选

y:y轴数据,列表或数组

format_string: 控制曲线的格式字符串,可选  由颜色字符、风格字符、标记字符组成

颜色字符:

b蓝色

g绿色

r红色

c青绿色

m洋红色

y黄色

k黑色

w白色

0.8灰度值字符串

 

风格字符:

-实线

--破折线

-.点划线

:虚线

“”””无线条


标记字符:

.点标记

,像素标记(一个非常小的点)

o实心圈标记

v倒三角标记

^上三角标记

>右。。。

<左。。。

1下花三角标记

2上花三角

3左花三角

4右花三角

s实心方形标记

p实心五角标记

*星型标记

h竖六边形标记

H横六边形标记

+十字标记

xx标记

D菱型标记

d瘦菱型标记

|垂直线标记


# plot函数使用具体
a = np.arange(10)
plt.plot(a, a, "go-", a, 2*a, "rx", a, 3*a, "*", a, 4*a, "b-.")
plt.show()

 

 

**kwargs: 第二组后更多(x, y, format_string)即绘制多条曲线

注意:当绘制多条曲线时,各条曲线的x不能省略

color:控制颜色,color=green

linestyle:线型风格,linestyle=dashed

marker:标记风格,marker=o

markerfacecolor:标记颜色,markerfacecolor=blue

markersize:标记尺寸,markersize=20

 

 

 

pyplot中文显示

中文显示方法一:

rcParams的属性:

# 法(1)
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams["font.family"] = "SimHei"  # SimHei为中文黑体
plt.plot([3, 1, 4, 5, 2])
plt.ylabel("纵轴(值)")
plt.savefig("test", dpi=600)  # 保存图片
plt.show()

 

font.family显示字体名字,

更多字体:’SimHei’为中文黑体  Kaiti 中文楷体  LiSu中文隶书  FangSong中文仿宋      YouYuan中文幼圆 STSong 华文宋体

 

“font.style”字体风格,正常”normal”或斜体”italic”

font.size字体大小,整数字号或者largex-small

# 更多字体
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 20
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间')
plt.ylabel('纵轴:振幅')
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()

 

中文显示方法二:

在有中文输出的地方,增加一个属性:fontproperties

好处:不是全局修改字体,比较灵活,推荐使用

# 方法二
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=25)
plt.ylabel('纵轴:振幅', fontproperties='Kaiti', fontsize=25)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()

pyplot 文本显示函数

plt.xlabel() 对x轴增加文本标签

plt.ylabel() 对y轴增加文本标签

plt.title() 对图形整体增加文本标签 (位于图形正上方)

plt.text() 在任意位置增加文本

plt.annotate() 在图形中增加带箭头的注解

 

# pyplot 文本显示函数

import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=25, color='green')
plt.ylabel('纵轴:振幅', fontproperties='Kaiti', fontsize=25)
# $括起来的文字是LaTeX文本语法
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=35)
# plt.text(2, 1, r'$\mu=100$', fontsize=15)  # 2, 1,表示文本放置的位置为坐标轴(2, 1)
# xy=(2, 1)表示箭头所在坐标,xytext=(3, 1.5)表示文本所在坐标,arrowprops表示箭头属性
# 依次为颜色、箭头两端留有有一定空白区域、箭头宽度
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5),
             arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)  # 加入网格线
plt.show()

 

pyplot的子绘图区域

plt.subplot()    plt.subplot2grid()--------------->可以定制各个板块区域大小

plt.subplot2grid(GridSpec, Curspec, colspan=1, rowspan=1)

 

目前用不到......

 

pyplot的基础绘图函数

plt.plot(x, y, fmt, ...) 绘制一个坐标图(也可以是极坐标系)

plt.boxplot(data, notch, position) 绘制一个箱型图

plt.bar(left, height, width, bottom) 绘制一个条形图

plt.barh(width, bottom, left, height) 绘制一个横向条形图

plt.polar(theta, r) 绘制一个极坐标图

plt.pie(data, explode) 绘制饼图

 

plt.psd(x, NFFT=256, pad_to, Fs) 功率谱密度图

plt.specgram(x, NFFT=256, pad_to, F) 绘制谱图

plt.cohere(x, y, NFFT=256, Fs) 绘制x -- y相关性函数

plt.scatter(x, y) 绘制散点图,其中x和y长度相同

plt.step(x, y, where) 绘制步阶图

plt.hist(x, bins, normed) 绘制直方图

 

plt.contour(X, Y , Z, N) 绘制等值图

plt.vlines()绘制垂直图

plt.stem(x, y, linefmt, markerfmt)绘制柴火图

plt.plot_data()绘制数据日期

 

pyplot饼图绘制(显示各个数据直观占比)

# (1)pyplot饼图绘制
import matplotlib.pyplot as plt
labels = "Frogs", "Hogs", "Dogs", "Logs"  # 标签
size = [15, 30, 45, 10]  # 每份标签所占比例
explode = (0, 0.1, 0, 0.2)  # 将饼图中 30 部分突出出来显示(突出比例为0.1),依次类推
# pie图中参数依次表示饼图尺寸、突出部分、标签、中间显示百分数的方式、
# False表示二维图,True表示三维(即存在阴影)、饼图起始角度
plt.pie(size, explode=explode, labels=labels, autopct="%1.1f%%",
        shadow=False, startangle=90)

plt.axis("equal")  # 饼图为正形(没有角度差异)
plt.show()

 

pyplot直方图的绘制(连续型数值数据,显示数据分布情况)

说明:横坐标连续

plt.hist()

Matplotlib.pyplot中hist()的参数:

n, bins, patches = plt.hist(arr, bins=10, normed=0,facecolor='black', edgecolor='black',alpha=1,histtype='bar')

hist的参数非常多,但常用的就这六个,只有第一个是必须的,后面四个可选

 

arr: 需要计算直方图的一维数组

bins: 直方图的柱数,可选项,默认为10

normed: 是否将得到的直方图向量归一化。默认为0

facecolor: 直方图颜色

edgecolor: 直方图边框颜色

alpha: 透明度

histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’

 

(1)单变量直方图

# (2)pyplot直方图的绘制
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)  # seed 种子可以产生一类随机数(各种各样,不过数据内容固定)
mu, sigma = 100, 20  # 设定均值和方差
a = np.random.normal(mu, sigma, size=100)  # normal产生正态分布数组

# 下列属性依次为,数组a、直方图个数(bins -----> 条的个数)、normed=1表示每个方块内元素出现的概率
# normed=0表示每个方块内元素出现的数目、
plt.hist(a, bins=50, normed=1, histtype="stepfilled", facecolor="b", alpha=0.75)
plt.title("Histogram")  # Histogram直方图 -------->  标题
plt.show()

 

(2)双变量直方图绘制

说明:x, y 均为变量,使用颜色深浅表示数量多少

# <2>  双变量直方图,颜色深浅表示数量(密度)
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000) + 2  # x轴中心为2
y = np.random.randn(1000) + 5  # y轴中心为5
plt.hist2d(x, y, bins=40)  # 绘制双变量
plt.show()

 

极坐标图绘制

待更......

 

 

pyplot散点图的绘制(数据相关性的研究)

散点图作用:绘出散点图后可以帮助了解两个变量的相关性(正相关、负相关、无关),比如,判断商品两个时间的价格(以两个时间的价格为横纵坐标描点绘图)

法一:

# (4)pyplot散点图的绘制,法一:直接使用plot绘制,法二:使用面向对象方法绘制
import  numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()  # 括号为空时表示绘制的图形只有一个区域
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), "o")  # 横纵坐标均为正态分布数值*10,形状为o形
ax.set_title("Simple Scatter")  # 标题
plt.show()

法二:

# 散点图
import  numpy as np
import matplotlib.pyplot as plt
# # 随机散点图
# n = 1000
# x = np.random.randn(n)
# y1 = np.random.randn(n)
# plt.scatter(x, y1)
# plt.show()

# 正相关散点图
n = 1000
x = np.random.randn(n)
y2 = x + np.random.randn(n) * 0.5  # 若想变为负相关,则在x前面加一个负号
plt.scatter(x, y2, s=15, c="r", marker=">", alpha=0.5)  # s(面积) 可以修改点的大小,
# c(color颜色)修改颜色,marker修改点的形状, alpha修改透明度(点过于集中时便于查看,点的分布情况)
plt.show()

负相关

 

折线图(数据随时间的变化趋势)

# 折线图(数据随时间的变化趋势)
import  numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 5)  # 分为五份
y = x**2
plt.plot(x, y)
plt.show()

 

条形图(比较多个项目分类数据的大小)

比较不同季度的销售

# 条形图(比较多个项目分类数据的大小)
import  numpy as np
import matplotlib.pyplot as plt
n = 5
y = [20, 30, 15, 10, 35]
index = np.arange(n)
# 横向
plt.subplot(2, 1, 1)
p1 = plt.bar(left=index, height=y, color="r", width=0.5)
# 纵向
plt.subplot(2, 1, 2)
p2 = plt.bar(left=0, bottom=index, width=y, color="r", height=0.5, orientation="horizontal")  
# orientation="horizontal"表示水平展示
# 横向也可以是   p2 = plt.barh(left=0, bottom=index, width=y)
plt.show()

 

多组条形图比较:

(1)并列比较

# 多组条形图比较
import  numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
sales_BJ = [52, 55, 65, 45]
sales_SH = [44, 36, 65, 41]
bar_width = 0.3
plt.bar(index, sales_BJ, bar_width, color="b")
plt.bar(index+1.5*bar_width, sales_SH, bar_width, color="r")
plt.show()

(2)层叠比较

# (2)层叠比较
import  numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
sales_BJ = [52, 55, 65, 45]
sales_SH = [44, 36, 65, 41]
bar_width = 0.3
plt.bar(index, sales_BJ, bar_width, color="b")
plt.bar(index, sales_SH, bar_width, color="r", bottom=sales_BJ)
plt.show()

 

箱型图(显示数据分散情况)

说明:图可以分为上边缘、上四分位数、中位数、下四分位数、下边缘、异常值

 

# # 箱型图(显示数据分散情况)
# # <1> 绘制一个箱型图
# import  numpy as np
# import matplotlib.pyplot as plt
# np.random.seed(100)
# data = np.random.normal(size=1000, loc=0, scale=1)
# plt.boxplot(data, sym=".", whis=1.5)  # sym 表示异常值点的形状,whis表示异常值的范围(默认为1.5)
# plt.show()

# <2> 绘制多个箱型图
import  numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=(1000, 4), loc=0, scale=1)
labels = ["A", "B", "C", "D"]
plt.boxplot(data, labels=labels, sym=".")

plt.show()

 

图像颜色和样式修改

颜色:b :green  g :green  r :red  c :cyan  m :magenta  y :yellow  k :black  w :white

(百度“颜色代码”)

点样式:.  ,  o  v ^ < > 1  2  3  8  s  p  * h  H  +  D  d  |  _

线样式(只有四种):- 实线    -- 虚线   -. 点划线   :点线

# 颜色和样式修改
import  numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
# 样式依次为线型、颜色、点形状(marker可以不写,如果不写不会划线)
plt.plot(y, '--', color="b", marker=".")
plt.plot(y + 1, '-.', color="g", marker=",")
plt.plot(y + 2, ':', color="r", marker="o")
plt.plot(y + 3, '-', color="c", marker="v")
plt.plot(y + 4, color="m", marker="^")
plt.plot(y + 5, color="y", marker="<")
plt.plot(y + 4, color="k", marker="1")
plt.plot(y + 4, color="w", marker="3")
plt.show()

 

样式字符串:将颜色、点型、线型写成一个字符串

如:cx--   mo:   kp-

# 样式字符串:将颜色、点型、线型写成一个字符串
import  numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
plt.plot(y, 'cx--')
plt.plot(y + 1, 'kp:')
plt.plot(y + 2, 'mo-.')
plt.plot(y + 3, 'k-')
plt.show()

 

面向对象绘图

(1)pyplot画法:

# pyplot画法
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 1)
y = np.random.randn(len(x))
plt.plot(x, y)
plt.title("pyplot")
plt.show()

 

(2)面向对象画法

生成多个子图(一个figure):

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 100)
fig = plt.figure()          # 添加画板

ax1 = fig.add_subplot(221)  # 添加坐标轴,以及分区
ax1.plot(x, x)              # 添加图像
ax2 = fig.add_subplot(222)
ax2.plot(x, -x)
ax3 = fig.add_subplot(223)
ax3.plot(x, x**2)
ax4 = fig.add_subplot(224)
ax4.plot(x, np.log(x))
plt.show()

 

生成多图(多个figure)

# 生成多图(多个figure)
import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.plot([1, 2, 3], [3, 2, 1])

fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.plot([1, 2, 3], [1, 2, 3])

plt.show()

绘制网格

# 绘制网格
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, x*2)
ax.grid(color="g", linewidth=1.5, linestyle="--")  # 依次为设置颜色、网格线粗细、线型
plt.show()

 

图例

# 图例
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 11, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
l, = plt.plot(x, x*2, label="Normal")
l1, = plt.plot(x, x*3, label="fast")
ax.plot(x, x*4, label="faster")
plt.legend(loc=0)  # 显示图例
# (loc表示location,loc=1-----> 图例在右上角显示,
# loc=2表示图例在左上角显示,0。。。3。。。4。。。)
plt.show()

 

坐标轴范围调整

# 坐标轴范围调整
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
figure = plt.plot(x, x*x)
plt.axis([-15, 15, 0, 50])  # 直接修改横纵坐标
# 只调节某一个轴
# plt.xlim([-10, 10])
# plt.ylim([0, 100])
# 只调节一边
plt.xlim(xmin=-10)
plt.ylim(ymax=100)
plt.show()

 

调整坐标轴刻度

# 调整坐标轴刻度
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 11, 1)
plt.plot(x, x)
ax = plt.gca()  # 获取当前图形坐标轴
ax.locator_params(nbins=20)  # nbins表示坐标轴有多少格
ax.locator_params("x", nbins=5)  # 只调整x轴
plt.show()

 

 

 

 

添加坐标轴(双y轴)

# 添加坐标轴
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2, 20, 1)
y1 = x*x
y2 = np.log(x)
fig = plt.figure()
ax1 = fig.add_subplot(111)

ax1.plot(x, y1)
ax1.set_ylabel("Y1")

ax2 = ax1.twinx()  # 绘制在同一x轴上(双y 轴)
ax2.plot(x, y2, "r")
ax2.set_ylabel("Y2")

ax1.set_xlabel("compare Y1 and Y2")

plt.show()

 

注释(插入箭头以及文本)

# 注释
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
y = x*x
plt.plot(x, y)
# 属性依次为文本内容、箭头起点、文本起点、箭头颜色箭头头部宽度以及箭头身体宽度
plt.annotate("this is the bottom", xy=(0, 5), xytext=(0, 50),
             arrowprops=dict(facecolor="r", headwidth=10, width=2))


plt.show()

 

 

 

 

文字(只插入文字内容)

# 文字(只插入文字内容)
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10, 11, 1)
y = x*x
plt.plot(x, y)
plt.text(-2, 40, "function: y = x*x ", family="fantasy", size=15, color="g", style="oblique")  
# family表示字体样式,size表示字号,颜色、style表示斜体与正体(默认为正)
plt.show()

 

 

图像美化

#
import matplotlib.pyplot as plt
import numpy as np
# 快速美化
plt.style.use("bmh")  # ggplot是美化的版式,类似还有dark_background  bmh (推荐)  grayscale  fivethirtyeight(推荐)

fig, axes = plt.subplots(ncols=2, nrows=2)
ax1, ax2, ax3, ax4 = axes.ravel()
x, y = np.random.normal(size=(2, 100))
ax1.plot(x, y, "o")
x = np.arange(0, 10)
y = np.arange(0, 10)
ncolors = len(plt.rcParams["axes.color_cycle"])
plt.show()

 

 

 

你可能感兴趣的:(python)