zoukankan      html  css  js  c++  java
  • matplotlib可视化

    1. 条形图

    import  pymysql
    import matplotlib.pyplot as plt
    # from matplotlib import font_manager
     
    ##获取一个数据库连接,注意如果是UTF-8类型的,需要制定数据库
    db=pymysql.connect(host="127.0.0.1",user='root',passwd="123456789",port=3306,db="demo",charset='utf8')
    cursor=db.cursor()#获取一个游标
    sql="select city,need from citys"
    cursor.execute(sql)
    result=cursor.fetchall() #result为元组
    cursor.close() #关闭游标
    db.close() #关闭数据库
     
    #将元组数据存进列表中
    city=[]
    need=[]
    for x in result:
        city.append(x[0])
        need.append(x[1])
        
    # 一种设置字体的方式
    # my_font = font_manager.FontProperties(fname="D:softwarepythonAnaconda3LibraryMyFontsGeiTangBuDaoDan.ttf")
    # 设置字体
    plt.rcParams['font.sans-serif']=['LiSu']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 设置图形大小
    plt.figure(figsize=(12, 5), dpi=120)
    # 设置刻度字体大小
    plt.xticks(fontsize=20)
    plt.yticks(fontsize=20)
    
    #直方图
    plt.bar(range(len(need)), need, color='r', tick_label=city)
    
    plt.xlabel("城市名", fontsize=20)
    plt.ylabel("数量", fontsize=20)
    plt.title("城市职位需求图", fontsize=20)
    for  x,y in enumerate(need):
        plt.text(x-0.4, y+0.4, '%s' % y)
    plt.show()
    
    

    2. 从数据库读入数据, 制作饼图

    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    ##获取一个数据库连接,注意如果是UTF-8类型的,需要制定数据库
    db=pymysql.connect(host="127.0.0.1",user='root',passwd="123456789",port=3306,db="demo",charset='utf8')
    cursor=db.cursor()#获取一个游标
    sql="select city,need from citys"
    cursor.execute(sql)
    result=cursor.fetchall() #result为元组
    col_result = cursor.description  # 获取查询结果的字段描述
    cursor.close() #关闭游标
    db.close() #关闭数据库
     
    # 设置字体
    plt.rcParams['font.sans-serif']=['LiSu']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 设置图形大小
    plt.figure(figsize=(6, 4), dpi=120)
    
    # 用数据库查询到的数据创建DataFrame
    # print(col_result)
    df = pd.DataFrame(result, columns=[col_result[0][0], col_result[1][0]])
    
    # 饼图
    slices = df.iloc[:, 1]
    activities = df.iloc[:, 0]
    plt.pie(slices,labels=activities,
            startangle=90, # 初始角度
            shadow= True, # 阴影
            textprops={'size': 'small'},
    #         colors=[], # 设置颜色
    #         radius=1.6, # 半径
            explode=(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.05, 0), # 突出
            autopct='%1.2f%%') # 
    
    plt.title('城市职位需求图')
    plt.show()
    

    3.折线图(完整)

    """折线图   (画出你和同桌在11-25岁谈过的女友数)  """
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体
    plt.rcParams['font.sans-serif'] = ['LiSu']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 1.设置图片大小
    # 实例化figure并传递参数  dpi为每英寸像素点数
    fig = plt.figure('Figure Object 1', # 图形对象名称  窗口左上角显示
        figsize=(8, 4), # 窗口大小
        dpi=80, # 分辨率
        facecolor = 'white',     # 背景色
    )
    
    # x轴和y轴
    x = range(11, 31)
    y_1 = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
    y_2 = [1, 0, 3, 1, 2, 2, 3, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    
    plt.plot(
        x,
        y_1,
        # 折线样式
        color='r',  # 设置线条颜色
        linestyle='--',  # 线条风格
        linewidth=1,  # 线条粗细
        alpha=0.5,  # 透明度
        label='自己',
        # 6.折点样式设置
        marker='o', # 折点形状
        markersize='3', # 或 ms --折点大小
        markerfacecolor='black', # 或 mfc --折点实心颜色
    )
    
    plt.plot(
        x,
        y_2,
        color='b',  # 设置线条颜色
        linestyle=':',  # 线条风格
        linewidth=1,  # 线条粗细
        alpha=0.5,  # 透明度
        label='同桌',
        # 折点样式设置
        marker='*', # 折点形状
        markersize='6', # 或 ms --折点大小
        markerfacecolor='pink', # 或 mfc --折点实心颜色
    )
    
    # 8.标出最高点 (因为横纵坐标没有必然联系所以比较难整)
    zip1 = dict( zip(x, y_1) ) # 把横纵坐标合为一个字典
    # 找出最大值和下标
    for key,value in zip1.items():
        if(value == max(zip1.values())):
            max_index1 = key
            max_value1 = value
    del zip1
    plt.plot(max_index1,max_value1,'ks')
    s = f"({max_index1},{max_value1})"
    # plt.annotate()函数用于标注文字
    plt.annotate(s, xytext=(max_index1,max_value1), xy=(max_index1,max_value1)) # 注释内容 注释文本的坐标点 被注释的坐标点,二维元组形如(x,y)
    ####
    zip2 = dict( zip(x, y_2) ) # 把横纵坐标合为一个字典
    # 找出最大值和下标
    for key,value in zip2.items():
        if(value == max(zip2.values())):
            max_index2 = key
            max_value2 = value
    del zip2
    plt.plot(max_index2,max_value2,'ks')
    s = f"({max_index2},{max_value2})"
    # plt.annotate()函数用于标注文字
    plt.annotate(s, xytext=(max_index2,max_value2), xy=(max_index2,max_value2))
    
    
    # 4.调整x和y轴刻度间距
    _xtick_labels = ["{}岁".format(i) for i in x]
    plt.xticks(x, _xtick_labels, rotation=45, fontsize=9)
    plt.yticks(range(0, 9))
    # 5.线条样式 颜色 透明度
    # 加网格 (透明度)
    plt.grid(alpha=0.5, linestyle='--', linewidth=1)
    
    # 3.描述信息(x轴[y轴.标题]代表什么)
    plt.xlabel('年龄')
    plt.ylabel('人数')
    plt.title("回忆青葱岁月", fontsize=16)
    
    plt.legend(loc='best')
    
    # 2.保存到本地 (可设置格式(svg矢量图))
    # plt.savefig("data/xxx.svg")
    
    # 7.图片加水印
    def add_watermark(x, y):
        fig.text(x, y, '寒川环宇', # text的位置,内容
            fontsize=16, 
            color='gray',
            ha='left', 
            va='top',
            rotation=-45, #旋转角度
            alpha=0.3,
            bbox = dict(facecolor = "#B0C4DE", alpha = 0.05)) # 加框(框体颜色,透明度)
        
    add_watermark(0.5, 0.6)
    add_watermark(0.5, 0.8)
    add_watermark(0.2, 0.6)
    add_watermark(0.2, 0.8)
    plt.show()
    

    结果

    4.条形图

    """条形图 bar()"""
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 示例
    # plt.bar(np.arange(2,5),np.arange(1,4),
    #         label="zt example") 
    # plt.bar([1,2,3],[2,4,1],label="tz example", color='g')
    # plt.xlabel("this is x")
    # plt.ylabel("this is y")
    # plt.title("this is bar")
    # plt.legend()
    # plt.show()
    
    """展示2017票房数据"""
    # 设置字体
    plt.rcParams['font.sans-serif'] = ['LiSu']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 1.设置图片大小
    # 实例化figure并传递参数  dpi为每英寸像素点数
    fig = plt.figure(figsize=(8, 4), dpi=200)
    
    movie_name = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
    box_office = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
    df = pd.DataFrame( {"电影名":movie_name, "票房(单位:亿)":box_office} )
    # df
    x = range(df.shape[0]) # x轴的列表
    y = box_office
    
    # bar()绘制条形图,只能接受可迭代的数字对象
    plt.bar(x, y,
        width = 0.4, # 默认0.8
        color = 'orange',
        tick_label = y,
        label = '电影', # 为设置图例作准备
        alpha = 0.9
    )
    # 通过设置xticks使数字与字符串对应
    plt.xticks(x, df.iloc[:, 0], rotation=90)
    # 设置描述信息
    plt.title("2017年电影票房展示")
    plt.xlabel(df.columns[0])
    plt.ylabel(df.columns[1])
    # 显示图例
    plt.legend()
        
    plt.show()
    

    5.水平条形图 barh()

    """水平条形图 barh()"""
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    """展示2017票房数据"""
    movie_name = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
    box_office = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
    df = pd.DataFrame( {"电影名":movie_name, "票房(单位:亿)":box_office} )
    # df
    
    # 设置字体
    plt.rcParams['font.sans-serif'] = ['LiSu']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 1.设置图片大小
    # 实例化figure并传递参数  dpi为每英寸像素点数
    fig, ax = plt.subplots(figsize=(20, 16), dpi=80)
    
    x = np.arange(df.shape[0]) # x轴的列表
    y = box_office
    
    # bar()绘制条形图,只能接受可迭代的数字对象
    plt.barh(x, y,
        height = 0.4,
        color = 'orange',
        label = '电影', # 为设置图例作准备
        alpha = 0.9,
        align='center'
    )
    
    # plt.yticks(y, movie_name) # , rotation=90
    ax.set_yticks(x)
    ax.set_yticklabels(df.iloc[:, 0], minor=False, fontsize=16)
    ax.invert_yaxis() # 标签读取自上而下labels read top-to-bottom
    # 设置描述信息
    ax.set_title("2017年电影票房展示", fontsize=20)
    ax.set_xlabel(df.columns[1], fontsize=20)
    ax.set_ylabel(df.columns[0], fontsize=20)
    # 显示图例
    ax.legend()
        
    plt.show()
    


    人生之事岂能尽如人意,生活如戏,哭笑皆由人,悲喜自己定
  • 相关阅读:
    2019-5-24-WPF-源代码-从零开始写一个-UI-框架
    2019-8-31-dotnet-通过-WMI-获取系统安装的驱动
    2018-12-18-WPF-一个空的-WPF-程序有多少个窗口
    2018-11-20-UWP-开发中,需要知道的1000个问题
    2019-8-31-C#-已知点和向量,求距离的点
    2018-10-31-C#-7.0-使用下划线忽略使用的变量
    2019-3-16-win10-uwp-鼠标移动到图片上切换图片
    MSP432 BSL流程(UART)
    UART串口简介
    C++ STL容器
  • 原文地址:https://www.cnblogs.com/Hephaestus/p/12984685.html
Copyright © 2011-2022 走看看