zoukankan      html  css  js  c++  java
  • python-可视化数据之柱状图/饼图/词云


    已解决:饼图各部分分离,词语颜色自定义设置后再随机

    未解决:背景透明设置

    注:数据来自存储的数据库


    可视化案例

    lMLX3d.md.png

    
    from random import randint
    from jobspider.dao.PositionDao import PositionDao
    from os import path
    import matplotlib.pyplot as plot
    import numpy as np
    from matplotlib import colors
    from wordcloud import WordCloud, ImageColorGenerator
    from PIL import Image
    from  matplotlib.colors import ListedColormap
    
    
    
    # 用来正常显示中文标签
    plot.rcParams['font.sans-serif'] = ['SimHei']
    # 用来正常显示负号
    plot.rcParams['axes.unicode_minus'] = False
    
    # Matplotlib的图像都位于Figure对象中。可以用plt.Figure创建一个新的Figure。
    fig = plot.figure()
    # 用add_subplot创建一个或多个subplot
    # add_subplot(将画布划分的行数,将画布划分的行数,位置是按照从左往右,从上到下自动排列的数)
    ax1 = fig.add_subplot(2, 2, 1)
    ax2 = fig.add_subplot(2, 2, 2)
    ax3 = fig.add_subplot(2, 1, 2)
    
    positionDao = PositionDao()
    resultTypeSalary = positionDao.getPostionStaaticTypeSalary()
    # print(resultTypeSalary) ((11935.70580446508, 'c/c++职位信息'), (11393.54413444911, 'java职位信息'), (11808.424901270604, 'python职位信息'), (16875.0, '人工智能职位信息'), (13790.123480902777, '大数据职位信息'))
    
    # 推导式,取各元组的第一个元素
    y = [y[0] for y in resultTypeSalary]
    x = [x[1] for x in resultTypeSalary]
    # print(x) ['c/c++职位信息', 'java职位信息', 'python职位信息', '人工智能职位信息', '大数据职位信息']
    # print(y) [11935.70580446508, 11393.54413444911, 11808.424901270604, 16875.0, 13790.123480902777]
    
    # 设置x轴的范围
    xAxis = list(range(len(x)))
    # print(xAxis) [0, 1, 2, 3, 4]
    # 设置y轴的范围
    # ax1.set_ylim([0, 140])
    
    
    # x轴每个标签的具体位置,设置为每个柱的中央
    ax1.set_xticks(xAxis)
    # x轴设置成职位值
    ax1.set_xticklabels(x)
    
    # x轴每个标签的具体位置,设置为每个柱的中央
    # x轴显示中文
    # plot.xticks(xAxis, x)
    
    # 图表名称
    ax1.set_title("职位薪资对比图")
    ax1.set_xlabel("职位")
    ax1.set_ylabel("薪资(元)")
    
    # 柱状图,颜色
    # 创建柱状图bar(x横轴,y纵轴,bar宽度[,描边线透明])
    bars = ax1.bar(xAxis, y, width=0.3)
    z_colors = ['#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c']
    for bar, color in zip(bars, z_colors):
        bar.set_color(color)
        pass
    
    # 顶部显示y值
    for xx, yy in zip(xAxis, y):
        ax1.text(xx, yy + 0.05, '%.0f(元)' % yy, ha='center', va='bottom')
    
    # 不同职位数量对比的饼图
    resultTypeCount = positionDao.getPostionStaaticTypeCount()
    print(resultTypeCount)
    # x职位信息 y职位数量信息
    xLabel = [x[1] for x in resultTypeCount]
    yValue = [y[0] for y in resultTypeCount]
    
    # 饼图颜色
    b_colors = ['#9287e7', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c']
    # 算出比例
    pg = [y / sum(yValue) * 100 for y in yValue]
    # 使用推导式获取每个部分的文字数据描述信息
    labels = ['%s%.2f %% ' % (x, p) for x, p in zip(xLabel, pg)]
    # 使用条件逻辑获取java的的部分 有输出距离0.0618 numpy
    explode = np.where(np.array(xLabel) == 'java职位信息', 0.0618, 0)
    # explode = np.where(np.array(xLabel) == 'python职位信息',0.0618, 0)
    # explode[2] = explodePython[2]
    # print(explode)
    
    # 修改pie()方法添加想要添加的参数参数
    ax2.pie(yValue, colors=b_colors, labels=labels, explode=explode)
    # 标题
    ax2.set_title("职位数量对比图")
    
    
    
    
    #词云
    resultTypeCityCount = positionDao.getPostionStaaticTypeCityCount()
    # print(resultTypeCityCount)
    #每次取list的元组元素出来给city
    city = [value[0] for value in resultTypeCityCount]
    text =' '.join(city)
    # print(text)
    # 获取当前脚本文件的绝对路径
    d = path.dirname(__file__)
    
    # x.sort()
    # print(x)
    # 设置图片
    alice_mask = np.array(Image.open(path.join(d,"img/1.png")))
    color_mask = np.array(Image.open(path.join(d,"img/2.jpg")))
    
    # 设置图片颜色
    # image_colors = ImageColorGenerator(color_mask)
    
    
    #自定义颜色列表
    color_list=['#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c','#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c',
                '#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c','#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c']
    # 基于自定义颜色表构建colormap对象
    colormap = colors.ListedColormap(color_list)
    # 设置字体
    font = r'C:WindowsFontsSimHei.ttf'
    wordcloud = WordCloud(background_color=None,
                          font_path=font,
                          max_font_size=300,
                          # height=4000, # 高度设置为400
                          #width=8000, # 宽度设置为800
                          colormap=colormap
                          ,mask=alice_mask,
                          random_state=42,
                          prefer_horizontal=0.5)#词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
    
    wordcloud.generate(text)
    ax3.imshow(wordcloud, interpolation="bilinear")
    ax3.set_title("IT热门城市")
    #取消图表x、y轴
    ax3.axis("off")
    # 显示
    plot.show()
    
    
    
    
  • 相关阅读:
    servlet(二)
    servlet(一)
    static、final、static final的区别
    java基础知识(一)
    IntelliJ IDEA中Debug的使用技巧
    IDEA从SVN中导入多模块项目
    Java实现MD5加密
    冒泡排序
    ulimit: core file size: cannot modify limit: Operation not permitted
    Linux 禁用摄像头
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/12119882.html
Copyright © 2011-2022 走看看