zoukankan      html  css  js  c++  java
  • 沉淀再出发:用python画各种图表

    沉淀再出发:用python画各种图表

    一、前言

        最近需要用python来做一些统计和画图,因此做一些笔记。

    二、python画各种图表

     2.1、使用turtle来画图

     1 import turtle as t #turtle库是python的内部库,直接import使用即可
     2 import time
     3 
     4 def draw_diamond(turt):
     5     for 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 
    12 def 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 
    21     for 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()
    37 for _ in range(50):
    38     t.forward(200)
    39     t.left(170)
    40 end_fill()
    41 time.sleep(1)

     2.2、画坐标系

     1 import sys
     2 import math
     3 import random
     4 import matplotlib.pyplot as plt
     5 import pylab as pl
     6 import 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、直方图

     1 import numpy as np
     2 import 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、扇形图/饼图

     1 import matplotlib.pyplot as plt
     2 import time
     3 from pylab import mpl
     4 import numpy as np
     5 import matplotlib.animation as animation
     6 import 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)
    18 print(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()

     1 import 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()

     1 import numpy as np
     2 import 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]))
    10 print(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'))
    14 print(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()

     1 import numpy as np
     2 import 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 # 自定义颜色和不透明度
    14 for 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、动图

     1 import matplotlib.pyplot as plt
     2 import time
     3 from pylab import mpl
     4 import numpy as np
     5 import matplotlib.animation as animation
     6 import 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 
    24 def update(frame):
    25     global dis
    26     global dis2
    27     global 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、画其他图形

     1 import matplotlib.pyplot as plt
     2 plt.rcdefaults()
     3  
     4 import numpy as np
     5 import matplotlib.pyplot as plt
     6 import matplotlib.path as mpath
     7 import matplotlib.lines as mlines
     8 import matplotlib.patches as mpatches
     9 from matplotlib.collections import PatchCollection
    10  
    11  
    12 def 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')
    92 plt.axis('off')
    93  
    94 plt.show()

     2.7、画点图

     1 from numpy import *;
     2 import numpy as np
     3 import 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
     2 import numpy as np
     3 import 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
     2 import numpy as np
     3 import 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()

    1 import numpy as np
    2 import 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.画多个子图

     1 import matplotlib.pyplot as plt
     2 '''
     3 subplot(numRows, numCols, plotNum)
     4 numRows行 * numCols列个子区域
     5 如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,
     6 例如subplot(323)和subplot(3,2,3)是相同的
     7 '''
     8 for 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、标记刻度

     1 import matplotlib.pyplot as pl
     2 from matplotlib.ticker import MultipleLocator, FuncFormatter
     3 import 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 
    10 def pi_formatter(x, pos):
    11     """
    12     比较罗嗦地将数值转换为以pi/4为单位的刻度文本
    13     """
    14     m = np.round(x / (np.pi/4))
    15     n = 4
    16     if m%2==0: m, n = m/2, n/2
    17     if m%2==0: m, n = m/2, n/2
    18     if m == 0:
    19         return "0"
    20     if m == 1 and n == 1:
    21         return "$pi$"
    22     if n == 1:
    23         return r"$%d pi$" % m
    24     if m == 1:
    25         return r"$frac{pi}{%d}$" % n
    26     return 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 # 设置刻度文本的大小
    40 for tick in ax.xaxis.get_major_ticks():
    41     tick.label1.set_fontsize(16)
    42 pl.show()

     2.11、三维图

     1 import matplotlib.pyplot as plt
     2 from mpl_toolkits.mplot3d import Axes3D
     3 import numpy as np
     4 
     5 def fun(x,y):
     6     #return np.power(x,2)+np.power(y,2)
     7     return 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 
     9 def fun2(xx,yy):
    10     return 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()

     1 import numpy as np
     2 import matplotlib.pyplot as plt
     3 from 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()

     1 from matplotlib import pyplot as plt
     2 import numpy as np
     3 from 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 -*-
     2 import numpy as np
     3 import matplotlib as mpl
     4 import matplotlib.pyplot as plt
     5 import random
     6 import matplotlib.dates as mdates
     7  
     8 from 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、柱状图、并列柱状图

     1 import numpy as np
     2 import matplotlib.animation as animation
     3 import 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 
    10 for 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()

     1 import numpy as np
     2 import 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 -*-
     2 import 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')
    12 for 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()

     1 import numpy as np
     2 import 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 -*-
     2 import 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()

     1 import numpy as np
     2 import 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 -*-
    2 import 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中的库,我们可以按照自己的想法来画图,但是需要注意一些细节上的东西,比如尺寸和刻度,比如颜色,字体,以及相应对比的数据,特别是用于数据分析上面的对比,我们需要重点掌握。

  • 相关阅读:
    一本通1269 有限背包
    python3 threading.Lock() 多线程锁的使用
    Sqlite3错误:Recursive use of cursors not allowed 的解决方案
    linux 常用命令
    90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来
    python3 使用flask连接数据库出现“ModuleNotFoundError: No module named 'MySQLdb'”
    Navicat Premium12远程连接MySQL数据库
    pymysql pymysql.err.OperationalError 1045 Access denied最简单解决办法
    CentOS7 安装MySQL8修改密码
    CentOS7 升级Openssl的办法
  • 原文地址:https://www.cnblogs.com/zyrblog/p/10023238.html
Copyright © 2011-2022 走看看