沉淀再出发:用python画各种图表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沉淀再出发:⽤python画各种图表
沉淀再出发:⽤python画各种图表
⼀、前⾔
最近需要⽤python来做⼀些统计和画图,因此做⼀些笔记。
⼆、python画各种图表
2.1、使⽤turtle来画图
1import turtle as t #turtle库是python的内部库,直接import使⽤即可
2import time
3
4def draw_diamond(turt):
5for i in range(1,3):
6 turt.forward(100) #向前⾛100步
7 turt.right(45) #海龟头向右转45度
8 turt.forward(100) #继续向前⾛100步
9 turt.right(135) #海龟头再向右转135度
10
11
12def draw_art():
13 window = t.Screen() #创建画布
14 window.bgcolor("green") #设置画布颜⾊
15 brad = t.Turtle() #创建⼀个Turtle的实例
16 brad.shape('turtle') #形状是⼀个海归turtle,也可以是圆圈circle,箭头(默认)等等
17
18 brad.color("red") #海龟的颜⾊是红⾊red,橙⾊orange等
19 brad.speed('fast') #海龟画图的速度是快速fast,或者slow等
20
21for i in range(1,37): #循环36次
22 draw_diamond(brad) #海龟画⼀个形状/花瓣,也就是菱形
23 brad.right(10) #后海龟头向右旋转10度
24
25 brad.right(90) #当图形画完⼀圈后,把海龟头向右转90度
26 brad.forward(300) #画⼀根长线/海龟往前⾛300步
27
28 window.exitonclick() #点击屏幕退出
29
30 draw_art() #调⽤函数开始画图
31
32
33
34 t.color("red", "yellow")
35 t.speed(10)
36 t.begin_fill()
37for _ in range(50):
38 t.forward(200)
39 t.left(170)
40 end_fill()
41 time.sleep(1)
2.2、画坐标系
1import sys
2import math
3import random
4import matplotlib.pyplot as plt
5import pylab as pl
6import numpy as np
7
8 pl.mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
9 pl.mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显⽰为⽅块的问题10
11 x = range(10) # 横轴的数据
12 y = [i*i for i in x] # 纵轴的数据
13 y1 = [i*i+123 for i in x] # 纵轴的数据
14 pl.title('title zyr')
15 pl.plot(x, y, '1m:', label=u'compare') # 加上label参数添加图例
16 pl.plot(x, y1, '>r--', label=u'set other') # 加上label参数添加图例
17 pl.xlabel(u"横轴的数据")
18 pl.ylabel(u"纵轴的数据")
19 pl.legend() # 让图例⽣效
20 pl.show() # 显⽰绘制出的图
import sys
import math
import random
import matplotlib.pyplot as plt
import pylab as pl
import numpy as np
pl.mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
pl.mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显⽰为⽅块的问题x = list(range(10))+[100]
y = [i*i for i in x]
pl.plot(x, y, 'ob-', label=u'y=x^2')
pl.xlim(-1, 11) # 限定横轴的范围
pl.ylim(-1, 110) # 限定纵轴的范围
pl.show() # 显⽰绘制出的图
1颜⾊(color 简写为 c):
2# 蓝⾊: 'b' (blue)
3# 绿⾊: 'g' (green)
4# 红⾊: 'r' (red)
5# 蓝绿⾊(墨绿⾊): 'c' (cyan)
6# 红紫⾊(洋红): 'm' (magenta)
7# 黄⾊: 'y' (yellow)
8# ⿊⾊: 'k' (black)
9# ⽩⾊: 'w' (white)
10
11# 线型(linestyle 简写为 ls):
12# 实线: '-'
13# 虚线: '--'
14# 虚点线: '-.'
15# 点线: ':'
16# 点: '.'
17
18# 点型(标记marker):
19# 像素: ','
20# 圆形: 'o'
21# 上三⾓: '^'
22# 下三⾓: 'v'
23# 左三⾓: '<'
24# 右三⾓: '>'
25# ⽅形: 's'
26# 加号: '+'
27# 叉形: 'x'
28# 棱形: 'D'
29# 细棱形: 'd'
30# 三脚架朝下: '1'(像'丫')
31# 三脚架朝上: '2'
32# 三脚架朝左: '3'
33# 三脚架朝右: '4'
34# 六⾓形: 'h'
35# 旋转六⾓形: 'H'
36# 五⾓形: 'p'
37# 垂直线: '|'
38# ⽔平线: '_'
2.3、直⽅图
1import numpy as np
2import matplotlib.pyplot as plt
3 np.random.seed(19680801)
4 mu1, sigma1 = 100, 15
5 mu2, sigma2 = 80, 15
6 x1 = mu1 + sigma1 * np.random.randn(10000)
7 x2 = mu2 + sigma2 * np.random.randn(10000)
8# the histogram of the data
9# 50:将数据分成50组
10# facecolor:颜⾊;alpha:透明度
11# density:是密度⽽不是具体数值
12 n1, bins1, patches1 = plt.hist(x1, 50, density=True, facecolor='g', alpha=1)
13 n2, bins2, patches2 = plt.hist(x2, 50, density=True, facecolor='r', alpha=0.2) 14# n:概率值;bins:具体数值;patches:直⽅图对象。
15 plt.xlabel('Smarts')
16 plt.ylabel('Probability')
17 plt.title('Histogram of IQ')
18 plt.text(110, .025, r'$\mu=100,\ \sigma=15$')
19 plt.text(50, .025, r'$\mu=80,\ \sigma=15$')
20# 设置x,y轴的具体范围
21 plt.axis([40, 160, 0, 0.03])
22 plt.grid(True)
23 plt.show()
2.4、扇形图/饼图
1import matplotlib.pyplot as plt
2import time
3from pylab import mpl
4import numpy as np
5import matplotlib.animation as animation
6import time
7
8 mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
9 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显⽰为⽅块的问题
10
11 data = {'8516464': 106, '8085460': 704, '7593813': 491, '8709362': 24, '8707829': 6, '8684658': 23, '8679301': 11,
12'8665923': 29, '8660909': 23, '8652968': 31, '8631727': 31, '8622935': 24, '8620593': 18, '8521737': 33,
13'8605441': 49, '8495205': 82, '8477276': 57,'8474489': 71, '8456502': 50, '8446529': 68, '8433830': 136,
14'8254158': 103, '8176029': 88, '8081724': 58, '7922592': 185, '7850099': 62,'7617723': 61, '7615562': 90,
15'7615052': 57, '7604151': 102, '7511294': 59,'6951654': 27, '6946388': 142, '6945373': 159, '6937716': 347,
16'7460176': 64, '7246377': 87, '7240621': 145, '7204707': 645, '7028401': 671}
17 source_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
18print(source_data)
19 labels = [source_data[i][0][:4] for i in range(len(source_data))] # 设置标签
20 fracs = [source_data[i][1] for i in range(len(source_data))]
21 explode = [x * 0.01 for x in range(len(source_data))] # 与labels⼀⼀对应,数值越⼤离中⼼区越远
22 plt.axes(aspect=1) # 设置X轴 Y轴⽐例
23# labeldistance标签离中⼼距离 pctdistance百分百数据离中⼼区距离 autopct 百分⽐的格式 shadow阴影
24 plt.pie(x=fracs, labels=labels, explode=explode, autopct='%3.1f %%',
25 shadow=False, labeldistance=1.1, startangle=0, pctdistance=0.8, center=(-1, 0))
26# 控制位置:bbox_to_anchor数组中,前者控制左右移动,后者控制上下。
ncol控制图例所列的列数。
默认值为1。
fancybox 圆边
27 plt.legend(loc=7, bbox_to_anchor=(1.2, 0.80), ncol=3, fancybox=True, shadow=True, fontsize=8)
28 plt.show()
1import matplotlib.pyplot as plt
2 labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
3 sizes = [15, 30, 45, 10]
4# 设置分离的距离,0表⽰不分离
5 explode = (0, 0.1, 0, 0)
6 plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
7 shadow=True, startangle=90)
8# Equal aspect ratio 保证画出的图是正圆形
9 plt.axis('equal')
10 plt.show()
1import numpy as np
2import matplotlib.pyplot as plt
3# 设置每环的宽度
4 size = 0.3
5 vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
6# 通过get_cmap随机获取颜⾊
7 cmap = plt.get_cmap("tab20c")
8 outer_colors = cmap(np.arange(3)*4)
9 inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
10print(vals.sum(axis=1))
11# [92. 77. 39.]
12 plt.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
13 wedgeprops=dict(width=size, edgecolor='w'))
14print(vals.flatten())
15# [60. 32. 37. 40. 29. 10.]
16 plt.pie(vals.flatten(), radius=1-size, colors=inner_colors,
17 wedgeprops=dict(width=size, edgecolor='w'))
18# equal 使得为正圆
19 plt.axis('equal')
20 plt.show()
1import numpy as np
2import matplotlib.pyplot as plt
3 np.random.seed(19680801)
4 N = 10
5 theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
6 radii = 10 * np.random.rand(N)
7 width = np.pi / 4 * np.random.rand(N)
8 ax = plt.subplot(111, projection='polar')
9 bars = ax.bar(theta, radii, width=width, bottom=0.0)
10# left表⽰从哪开始,
11# radii表⽰从中⼼点向边缘绘制的长度(半径)
12# width表⽰末端的弧长
13# ⾃定义颜⾊和不透明度
14for r, bar in zip(radii, bars):
15 bar.set_facecolor(plt.cm.viridis(r / 10.))
16 bar.set_alpha(0.5)
17 plt.show()
2.5、动图
1import matplotlib.pyplot as plt
2import time
3from pylab import mpl
4import numpy as np
5import matplotlib.animation as animation
6import time
7
8 mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
9 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显⽰为⽅块的问题10
11
12# Fixing random state for reproducibility
13 np.random.seed(196)
14# 初始数据绘图
15 dis = np.zeros(40)
16 dis2 = dis
17 fig, ax = plt.subplots()
18 line, = ax.plot(dis)
19 ax.set_ylim(-1, 1)
20 plt.grid(True)
21 ax.set_ylabel("distance: m")
22 ax.set_xlabel("time")
23
24def update(frame):
25global dis
26global dis2
27global line
28# 读⼊模拟
29 a = np.random.rand() * 2 - 1
30 time.sleep(np.random.rand() / 10)
31# 绘图数据⽣成
32 dis[0:-1] = dis2[1:]
33 dis[-1] = a
34 dis2 = dis
35# 绘图
36 line.set_ydata(dis)
37# 颜⾊设置
38 plt.setp(line, 'color', 'c', 'linewidth', 2.0)
39 ani = animation.FuncAnimation(fig, update, frames=None, interval=100)
40 plt.show()
2.6、画其他图形
1import matplotlib.pyplot as plt
2 plt.rcdefaults()
3
4import numpy as np
5import matplotlib.pyplot as plt
6import matplotlib.path as mpath
7import matplotlib.lines as mlines
8import matplotlib.patches as mpatches
9from matplotlib.collections import PatchCollection
10
11
12def label(xy, text):
13 y = xy[1] - 0.15 # shift y-value for label so that it's below the artist
14 plt.text(xy[0], y, text, ha="center", family='sans-serif', size=14)
15
16
17 fig, ax = plt.subplots()
18# create 3x3 grid to plot the artists
19 grid = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2, -1).T
20
21 patches = []
22
23# add a circle
24 circle = mpatches.Circle(grid[0], 0.1, ec="none")
25 patches.append(circle)
26 label(grid[0], "Circle")
27
28# add a rectangle
29 rect = mpatches.Rectangle(grid[1] - [0.025, 0.05], 0.05, 0.1, ec="none")
30 patches.append(rect)
31 label(grid[1], "Rectangle")
32
33# add a wedge
34 wedge = mpatches.Wedge(grid[2], 0.1, 30, 270, ec="none")
35 patches.append(wedge)
36 label(grid[2], "Wedge")
37
38# add a Polygon
39 polygon = mpatches.RegularPolygon(grid[3], 5, 0.1)
40 patches.append(polygon)
41 label(grid[3], "Polygon")
42
43# add an ellipse
44 ellipse = mpatches.Ellipse(grid[4], 0.2, 0.1)
45 patches.append(ellipse)
46 label(grid[4], "Ellipse")
47
48# add an arrow
49 arrow = mpatches.Arrow(grid[5, 0] - 0.05, grid[5, 1] - 0.05, 0.1, 0.1, width=0.1)
50 patches.append(arrow)
51 label(grid[5], "Arrow")
52
53# add a path patch
54 Path = mpath.Path
55 path_data = [
56 (Path.MOVETO, [0.018, -0.11]),
57 (Path.CURVE4, [-0.031, -0.051]),
58 (Path.CURVE4, [-0.115, 0.073]),
59 (Path.CURVE4, [-0.03 , 0.073]),
60 (Path.LINETO, [-0.011, 0.039]),
61 (Path.CURVE4, [0.043, 0.121]),
62 (Path.CURVE4, [0.075, -0.005]),
63 (Path.CURVE4, [0.035, -0.027]),
64 (Path.CLOSEPOLY, [0.018, -0.11])
65 ]
66 codes, verts = zip(*path_data)
67 path = mpath.Path(verts + grid[6], codes)
68 patch = mpatches.PathPatch(path)
69 patches.append(patch)
70 label(grid[6], "PathPatch")
71
72# add a fancy box
73 fancybox = mpatches.FancyBboxPatch(
74 grid[7] - [0.025, 0.05], 0.05, 0.1,
75 boxstyle=mpatches.BoxStyle("Round", pad=0.02))
76 patches.append(fancybox)
77 label(grid[7], "FancyBboxPatch")
78
79# add a line
80 x, y = np.array([[-0.06, 0.0, 0.1], [0.05, -0.05, 0.05]])
81 line = mlines.Line2D(x + grid[8, 0], y + grid[8, 1], lw=5., alpha=0.3)
82 label(grid[8], "Line2D")
83
84 colors = np.linspace(0, 1, len(patches))
85 collection = PatchCollection(patches, cmap=plt.cm.hsv, alpha=0.3)
86 collection.set_array(np.array(colors))
87 ax.add_collection(collection)
88 ax.add_line(line)
89
90 plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
91 plt.axis('equal')
91 plt.axis('equal')
92 plt.axis('off')
93
94 plt.show()
2.7、画点图
1from numpy import *;
2import numpy as np
3import matplotlib.pyplot as plt
4
5 N = 50
6 x = np.random.rand(N)
7 y = np.random.rand(N)
8 colors = np.random.rand(N)
9 area = np.pi * (15 * np.random.rand(N))**2
10 plt.scatter(x, y, s=area, c=colors, alpha=0.5, marker=(9, 3, 30))
11 plt.show()
2.8、画数学曲线
1#coding:utf-8
2import numpy as np
3import matplotlib.pyplot as plt
4 x=np.linspace(0,10,1000)
5 y=np.sin(x)
6 z=np.cos(x**2)
7#控制图形的长和宽单位为英⼨,
8# 调⽤figure创建⼀个绘图对象,并且使它成为当前的绘图对象。
9 plt.figure(figsize=(8,4))
10#$可以让字体变得跟好看
11#给所绘制的曲线⼀个名字,此名字在图⽰(legend)中显⽰。
12# 只要在字符串前后添加"$"符号,matplotlib就会使⽤其内嵌的latex引擎绘制的数学公式。
13#color : 指定曲线的颜⾊
14#linewidth : 指定曲线的宽度
15 plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
16#b-- 曲线的颜⾊和线型
17 plt.plot(x,z,"b--",label="$cos(x^2)$")
18#设置X轴的⽂字
19 plt.xlabel("Time(s)")
20#设置Y轴的⽂字
21 plt.ylabel("Volt")
22#设置图表的标题
23 plt.title("PyPlot First Example")
24#设置Y轴的范围
25 plt.ylim(-1.2,1.2)
26#显⽰图⽰
27 plt.legend()
28#显⽰出我们创建的所有绘图对象。
29 plt.show()
1#coding:utf-8
2import numpy as np
3import matplotlib.pyplot as plt
4 x=np.arange(0,5,0.1)
5## plot返回⼀个列表,通过line,获取其第⼀个元素
6 line,=plt.plot(x,x*x)
7# 调⽤Line2D对象的set_*⽅法设置属性值是否抗锯齿
8 line.set_antialiased(False)
9# 同时绘制sin和cos两条曲线,lines是⼀个有两个Line2D对象的列表
10 lines = plt.plot(x, np.sin(x), x, np.cos(x))
11## 调⽤setp函数同时配置多个Line2D对象的多个属性值
12 plt.setp(lines, color="r", linewidth=2.0)
13 plt.show()
1import numpy as np
2import matplotlib.pyplot as plt
3 x = np.arange(0., 5., 0.2)
4# 红⾊破折号, 蓝⾊⽅块,绿⾊三⾓块
5 plt.plot(x, x, 'r--', x, x**2, 'bs', x, x**3, 'g^')
6 plt.show()
2.9.画多个⼦图
1import matplotlib.pyplot as plt
2'''
3subplot(numRows, numCols, plotNum)
4numRows⾏ * numCols列个⼦区域
5如果numRows,numCols和plotNum这三个数都⼩于10的话,可以把它们缩写为⼀个整数, 6例如subplot(323)和subplot(3,2,3)是相同的
7'''
8for idx, color in enumerate("rgbyckbyc"):
9 plt.subplot(330+idx+1, facecolor=color)
10 plt.show()
11 plt.subplot(221) # 第⼀⾏的左图
12 plt.subplot(222) # 第⼀⾏的右图
13#第⼆⾏全占
14 plt.subplot(212) # 第⼆整⾏
15 plt.show()
16
17 plt.subplot(331, facecolor='r')
18 plt.show()
2.10、标记刻度
2from matplotlib.ticker import MultipleLocator, FuncFormatter 3import numpy as np
4 x = np.arange(0, 4*np.pi, 0.01)
5 y = np.sin(x)
6 pl.figure(figsize=(8,4))
7 pl.plot(x, y)
8 ax = pl.gca()
9
10def pi_formatter(x, pos):
11"""
12⽐较罗嗦地将数值转换为以pi/4为单位的刻度⽂本13"""
14 m = np.round(x / (np.pi/4))
15 n = 4
16if m%2==0: m, n = m/2, n/2
17if m%2==0: m, n = m/2, n/2
18if m == 0:
19return"0"
20if m == 1 and n == 1:
21return"$\pi$"
22if n == 1:
23return r"$%d \pi$" % m
24if m == 1:
25return r"$\frac{\pi}{%d}$" % n
26return r"$\frac{%d \pi}{%d}$" % (m,n)
27# 设置两个坐标轴的范围
28 pl.ylim(-1.5,1.5)
29 pl.xlim(0, np.max(x))
30# 设置图的底边距
31 pl.subplots_adjust(bottom = 0.15)
32 pl.grid() #开启⽹格
33# 主刻度为pi/4
34 ax.xaxis.set_major_locator( MultipleLocator(np.pi/4) )
35# 主刻度⽂本⽤pi_formatter函数计算
36 ax.xaxis.set_major_formatter( FuncFormatter( pi_formatter ) ) 37# 副刻度为pi/20
38 ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) )
39# 设置刻度⽂本的⼤⼩
40for tick in ax.xaxis.get_major_ticks():
41 bel1.set_fontsize(16)
42 pl.show()
2.11、三维图
2from mpl_toolkits.mplot3d import Axes3D
3import numpy as np
4
5def fun(x,y):
6#return np.power(x,2)+np.power(y,2)
7return 2*(x*0.8+y*0.1)*(x*0.2+y*0.9)*(x*0.3+y*0.7)*(x*0.3+y*0.7)*(x*0.4+y*0.7)*(x*0.4+y*0.7) 8
9def fun2(xx,yy):
10return xx
11
12 fig1=plt.figure()
13 ax=Axes3D(fig1)
14 X=np.arange(0,1,0.01)
15 Y=np.arange(0,1,0.01)
16
17 XX=np.arange(0,1,0.01)
18 YY=np.arange(1,0,-0.01)
19
20 ZZ=np.arange(0,1,0.01)
21
22 ZZ,ZZ=np.meshgrid(ZZ,ZZ)
23
24#ZZ=fun2(XX,YY)
25 X,Y=np.meshgrid(X,Y)
26 Z=fun(X,Y)
27 plt.title("This is main title")
28 ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.cm.coolwarm)
29
30 ax.plot_surface(XX, YY, ZZ, rstride=1, cstride=1, cmap=plt.cm.coolwarm)
31
32 ax.set_xlabel(u'θ1', color='r')
33 ax.set_ylabel(u'θ2', color='g')
34 ax.set_zlabel('z label', color='b')
35 plt.show()
1import numpy as np
2import matplotlib.pyplot as plt
3from mpl_toolkits.mplot3d import Axes3D
4 data = np.random.randint(0, 255, size=[40, 40, 40])
5 x, y, z = data[0], data[1], data[2]
6 ax = plt.subplot(111, projection='3d') # 创建⼀个三维的绘图⼯程
7# 将数据点分成三部分画,在颜⾊上有区分度
8 ax.scatter(x[:10], y[:10], z[:10], c='y') # 绘制数据点
9 ax.scatter(x[10:20], y[10:20], z[10:20], c='r')
10 ax.scatter(x[30:40], y[30:40], z[30:40], c='g')
11 ax.set_zlabel('Z') # 坐标轴
12 ax.set_ylabel('Y')
13 ax.set_xlabel('X')
14 plt.show()
1from matplotlib import pyplot as plt
2import numpy as np
3from mpl_toolkits.mplot3d import Axes3D
4 fig = plt.figure()
5 ax = Axes3D(fig)
6 X = np.arange(-4, 4, 0.25)
7 Y = np.arange(-4, 4, 0.25)
8 X, Y = np.meshgrid(X, Y)
9 R = np.sqrt(X**2 + Y**2)
10 Z = np.sin(R)
11# 具体函数⽅法可⽤ help(function) 查看,如:help(ax.plot_surface)
12 ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
13 plt.show()
2.12、画3d柱状图
1#-*- coding:utf-8 -*-
2import numpy as np
3import matplotlib as mpl
4import matplotlib.pyplot as plt
5import random
6import matplotlib.dates as mdates
7
8from mpl_toolkits.mplot3d import Axes3D
9#generate random numbers
10 Query_times1=range(0,50)
11 Query_times2=range(0,30)
12 list_random1=random.sample(Query_times1,25)
13 list_random2=random.sample(Query_times2,25)
14 mpl.rcParams['font.size'] = 8
15
16 fig = plt.figure()
17 ax = fig.add_subplot(111, projection='3d')
18
19 xs = np.arange(1,26)
20 ys =list_random1
21 ys2=list_random2
22 ys3=list_random1
23 ys4=list_random2
24 ys5=list_random1
25 ys6=list_random2
26 ys7=list_random1
27 ys8=list_random2
28
29
30 z1=3
31 total_width, n = 0.8, 2
32 width = total_width / n
33 color =plt.cm.Set2((np.arange(plt.cm.Set2.N)))
34 p1=ax.bar(xs, ys, z1, zdir='y', color='#FF0080', alpha=0.8,width=width,label='h=3,DA')
35 p2=ax.bar(xs + width, ys2, z1, zdir='y', color='CYAN', alpha=0.8,width=width,label='h=3,DGA')
36
37 z2=4
38 total_width, n = 0.8, 2
39 width = total_width / n
40 color =plt.cm.Set2((np.arange(plt.cm.Set2.N)))
41 p3=ax.bar(xs, ys3, z2, zdir='y', color='b', alpha=0.8,width=width,label='h=4,DA')
42 p4=ax.bar(xs + width, ys4, z2, zdir='y', color='#9AFF02', alpha=0.8,width=width,label='h=4,DGA')
43
44 z3=5
45 total_width, n = 0.8, 2
46 width = total_width / n
47 color =plt.cm.Set2((np.arange(plt.cm.Set2.N)))
48 p5=ax.bar(xs, ys5, z3, zdir='y', color='#FF8000', alpha=0.8,width=width,label='h=5,DA')
49 p6=ax.bar(xs + width, ys6, z3, zdir='y', color='violet', alpha=0.8,width=width,label='h=5,DGA')
50
51 z4=6
52 total_width, n = 0.8, 2
53 width = total_width / n
54 color =plt.cm.Set2((np.arange(plt.cm.Set2.N)))
55 p7=ax.bar(xs, ys7, z4, zdir='y', color='r', alpha=0.8,width=width,label='h=6,DA')
56 p8=ax.bar(xs + width, ys8, z4, zdir='y', color='#0072E3', alpha=0.8,width=width,label='h=6,DGA')
57
58# ax.xaxis.set_major_locator(mpl.ticker.FixedLocator(xs))
59# ax.yaxis.set_major_locator(mpl.ticker.FixedLocator(ys))
60
61 ax.set_xlabel('k-')
62 ax.set_ylabel('Spatial hierarchy (h)')
63 ax.set_zlabel('Count')
64# plt.legend(loc='upper left')
65#plt.legend(loc='upper left', bbox_to_anchor=(0.0,0.6),ncol=1,fancybox=True,shadow=False)#Control the position of the legend 66 plt.show()
2.13、柱状图、并列柱状图
2import matplotlib.animation as animation
3import time
4
5 mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
6 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显⽰为⽅块的问题
7
8 source_data = {'mock_verify': 369, 'mock_notify': 192, 'mock_sale': 517} # 设置原始数据
9
10for a, b in source_data.items():
11 plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=11) # ha ⽂字指定在柱体中间, va指定⽂字位置 fontsize指定⽂字体⼤⼩12
13# 设置X轴Y轴数据,两者都可以是list或者tuple
14 x_axis = tuple(source_data.keys())
15 y_axis = tuple(source_data.values())
16 plt.bar(x_axis, y_axis, color='rg') # 如果不指定color,所有的柱体都会是⼀个颜⾊
17
18 plt.xlabel(u"渠道名") # 指定x轴描述信息
19 plt.ylabel(u"访问量") # 指定y轴描述信息
20 plt.title("渠道访问量统计表") # 指定图表描述信息
21 plt.ylim(0, 600) # 指定Y轴的⾼度
22# plt.savefig('{}.png'.format(time.strftime('%Y%m%d%H%M%S'))) # 保存为图⽚
23 plt.show()
1import numpy as np
2import matplotlib.pyplot as plt
3 x = [1,2] #横坐标
4 y = [3,4] #第⼀个纵坐标
5 y1 = [5,6] #第⼆个纵坐标
6 x = np.arange(len(x)) #⾸先⽤第⼀个的长度作为横坐标
7 width = 0.05 #设置柱与柱之间的宽度
8 fig,ax = plt.subplots()
9 ax.bar(x,y,width,alpha = 0.9)
10 ax.bar(x+width,y1,width,alpha = 0.9,color= 'red')
11 ax.set_xticks(x +width/2)#将坐标设置在指定位置
12 ax.set_xticklabels(x)#将横坐标替换成
13 plt.show()
1# -*- coding: utf-8 -*-
2import matplotlib.pyplot as plt
3
4 name_list = ['Monday','Tuesday','Friday','Sunday']
5 num_list = [1.5,0.6,7.8,6]
6 num_list1 = [1,2,3,1]
7 x =list(range(len(num_list)))
8 total_width, n = 0.8, 2
9 width = total_width / n
10
11 plt.bar(x, num_list, width=width, label='boy',fc = 'y')
12for i in range(len(x)):
13 x[i] = x[i] + width
14 plt.bar(x, num_list1, width=width, label='girl',tick_label = name_list,fc = 'r')
15 plt.legend()
16 plt.show()
2import matplotlib.pyplot as plt
3 size = 5
4 a = np.random.random(size)
5 b = np.random.random(size)
6 c = np.random.random(size)
7 x = np.arange(size)
8# 有多少个类型,只需更改n即可
9 total_width, n = 0.8, 3
10 width = total_width / n
11# 重新拟定x的坐标
12 x = x - (total_width - width) / 2
13# 这⾥使⽤的是偏移
14 plt.bar(x, a, width=width, label='a')
15 plt.bar(x + width, b, width=width, label='b')
16 plt.bar(x + 2 * width, c, width=width, label='c')
17 plt.legend()
18 plt.show()
2.13、堆叠柱状图
1# -*- coding: utf-8 -*-
2import matplotlib.pyplot as plt
3
4 name_list = ['Monday','Tuesday','Friday','Sunday']
5 num_list = [1.5,0.6,7.8,6]
6 num_list1 = [1,2,3,1]
7 plt.bar(range(len(num_list)), num_list, label='boy',fc = 'y')
8 plt.bar(range(len(num_list)), num_list1, bottom=num_list, label='girl',tick_label = name_list,fc = 'r')
9 plt.legend()
10 plt.show()
1import numpy as np
2import matplotlib.pyplot as plt
3 size = 5
4 a = np.random.random(size)
5 b = np.random.random(size)
6 c = np.random.random(size)
7 x = np.arange(size)
8# 这⾥使⽤的是偏移
9 plt.bar(x, a, width=0.5, label='a',fc='r')
10 plt.bar(x, b, bottom=a, width=0.5, label='b', fc='g')
11 plt.bar(x, c, bottom=a+b, width=0.5, label='c', fc='b')
12 plt.ylim(0, 2.5)
13 plt.legend()
14 plt.grid(True)
15 plt.show()
2.14、横排柱状图
1# -*- coding: utf-8 -*-
2import matplotlib.pyplot as plt
3
4 name_list = ['Monday','Tuesday','Friday','Sunday']
5 num_list = [1.5,0.6,7.8,6]
6 plt.barh(range(len(num_list)), num_list,tick_label = name_list)
7 plt.show()
三、总结
使⽤python中的库,我们可以按照⾃⼰的想法来画图,但是需要注意⼀些细节上的东西,⽐如尺⼨和刻度,⽐如颜⾊,字体,以及相应对⽐的数据,特别是⽤于数据分析上⾯的对⽐,我们需要重点掌握。