2021-05-17

数据可视化,简单来说就是在项目初期开始进行探索性的数据分析,这样方便整体对数据有一定的了解。其中最直观的就是采用数据可视化技术,这样,数据不仅一目了然,而且更容易被解读。同样在数据分析得到结果之后,我们还需要用到可视化技术,把最终的结果呈现出来。
如何做Python 的数据可视化?
pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。
一、安装,安装pyecharts第三方库,一定要注意安装的版本,1.0以上和1.0以下的代码是有差距的。pyecharts 兼容 Python2 和 Python3。
进入python安装的目录,输入安装命令:

pip install pyecharts

接着就可以尝试着做一些数据可视化的实例了。
1.读取.xls表格,读出其中某列或某行的数据,实现可视化。
这里给出的是分析本专业学生的男女比例情况。
先来看最后的运行结果:
饼状图:
在这里插入图片描述
柱状图:
在这里插入图片描述
饼状图和柱状图都能够比较直接的了解数据情况,也是简单的数据可视化中最常用的。源代码如下:

#功能:软件专业男女同学性别比例饼图和柱状图
from wordcloud import WordCloud
import jieba
import re
from pyecharts import Pie
import xlrd
from pyecharts import Bar
#1.读取xls文件,把性别信息读取出来
def getSex(filename):

       workbook=xlrd.open_workbook(filename)

       sheet1=workbook.sheet_by_index(0)

       sheet2=workbook.sheet_by_index(1)

       sex181=[]

       sex182=[]

       for i in range(1, sheet1.nrows):

           sex181.append(sheet1.cell(i, 5).value)

       for i in range(1, sheet2.nrows):

           sex182.append(sheet2.cell(i, 5).value)

       return sex181,sex182
#2.性别pyechart可视化饼图

def VisualSexpyechart(lstsex1,lstsex2):

       sex1 = dict()

       sex2= dict()

       #2.1提取性别信息,从1开始,因为第0个是自己

       for f in lstsex1[0:]:

              if f == '男':  # 男

                     sex1["man"] = sex1.get("man", 0) + 1

              else:  # 女

                     sex1["women"] = sex1.get("women", 0) + 1

       for f in lstsex2[0:]:

              if f == '男':  # 男

                     sex2["man"] = sex2.get("man", 0) + 1

              else:  # 女

                     sex2["women"] = sex2.get("women", 0) + 1

       #在屏幕上打印出来

       total1= len(lstsex1[0:])

       total2= len(lstsex2[0:])

       #2.2打印出性别比例

       print( "181男同学: %.2f%%" % ( float(sex1["man"])/total1* 100) + "n" +"女同学: %.2f%%" % (float(sex2["women"]) / total1 * 100))

       print( "182男同学: %.2f%%" % ( float(sex2["man"])/total2* 100) + "n" +"女同学: %.2f%%" % (float(sex2["women"]) / total2 * 100))

       #2.3使用echarts饼状图

       attr = ['男同学', '女同学']

       value1 = [sex1["man"],sex1["women"]]

       value2 = [sex2["man"],sex2["women"]]

       pie = Pie('班级性别比例', title_pos='center',width=900)

       pie.add('', attr, value1,center=[25, 50], radius=[40, 75], rosetype='area', is_label_show=True,is_legend_show=True, legend_top='bottom',background_color="yellow")

       pie.add('', attr, value2, center=[65, 50],radius=[40, 75], rosetype='area', is_label_show=True,is_legend_show=True, legend_top='bottom',color="yellow")

       pie.show_config()

       pie.render('软件18同学性别比例饼图.html')

       

#3.性别pyechart可视化柱图

def VisualSexpyechart1(lstsex1,lstsex2):

       sex1 = dict()

       sex2= dict()

       #2.1提取性别信息,从1开始,因为第0个是自己

       for f in lstsex1[0:]:

              if f == '男':  # 男

                     sex1["man"] = sex1.get("man", 0) + 1

              else:  # 女

                     sex1["women"] = sex1.get("women", 0) + 1

       for f in lstsex2[0:]:

              if f == '男':  # 男

                     sex2["man"] = sex2.get("man", 0) + 1

              else:  # 女

                     sex2["women"] = sex2.get("women", 0) + 1

       #在屏幕上打印出来

       total1= len(lstsex1[0:])

       total2= len(lstsex2[0:])

       #2.2打印出性别比例

       print( "181男同学: %.2f%%" % ( float(sex1["man"])/total1* 100) + "n" +"女同学: %.2f%%" % (float(sex2["women"]) / total1 * 100))

       print( "182男同学: %.2f%%" % ( float(sex2["man"])/total2* 100) + "n" +"女同学: %.2f%%" % (float(sex2["women"]) / total2 * 100))

       #2.3使用echarts柱状图

       attr= ['18男同学', '18女同学']

       value1 = [sex1["man"],sex1["women"]]

       value2 = [sex2["man"],sex2["women"]]

       bar = Bar('班级性别比例', title_pos='center',width=900)

       bar.add('', attr, value1, mark_line=["average"], mark_point=["max", "min"],color="yellow")

       bar.add('', attr, value2, mark_line=["average"], mark_point=["max", "min"],color="red")

       bar.render('软件18同学性别比例柱图.html')

#4.执行主程序,得到所有性别

ls1,ls2=getSex("E:\Pythonsoft\数据分析编程需要的文件\软件18学生详细名单.xls")#这是.xls文件的路径。
VisualSexpyechart(ls1,ls2)
VisualSexpyechart1(ls1,ls2)

2.散点图
在这里插入图片描述

frompyecharts importEffectScatterv1 =[10, 20, 30, 40, 50, 60]v2 =[25, 20, 15, 10, 60, 33]es =EffectScatter("动态散点图示例")es.add("effectScatter", v1, v2)es.render()
es =EffectScatter("动态散点图各种图形示例")es.add("", [10], [10], symbol_size=20, effect_scale=3.5, effect_period=3, symbol="pin")es.add("", [20], [20], symbol_size=12, effect_scale=4.5, effect_period=4,symbol="rect")es.add("", [30], [30], symbol_size=30, effect_scale=5.5, effect_period=5,symbol="roundRect")es.add("", [40], [40], symbol_size=10, effect_scale=6.5, effect_brushtype='fill',symbol="diamond")es.add("", [50], [50], symbol_size=16, effect_scale=5.5, effect_period=3,symbol="arrow")es.add("", [60], [60], symbol_size=6, effect_scale=2.5, effect_period=3,symbol="triangle")es.render()
#此部分代码参考于网络

3.关系图:一个表格中某行某列若有相同的信息,可以将其可视化为关系图,研究数据之间的联系,比如某班级的寝室关系图,人脉关系图。这里以某班级寝室关系图为例:
在这里插入图片描述
由寝室关系图可以看出,班级很多同学并不是以寝室为单位组成团体,有相当一部分是单个或两个在一个寝室中,由此推测在大类新分专业后寝室并没有重新按专业分配调整,从寝室包括人数可以看出寝室至少是几人寝。

#功能:寝室关系图

import xlrd
from pyecharts import Graph

def getRoom(filename):
    Room={}
    data = xlrd.open_workbook(filename,'r',encoding_override='utf-8')
    table1 = data.sheets()[0] # 软件181
    table2 = data.sheets()[1] # 软件182
    rows1 = table1.nrows 
    rows2 = table2.nrows
    for i in range(rows1):
        if i==0:
            continue
        Room[table1.row_values(i)[3]]=table1.row_values(i)[9]
    for i in range(rows2):
        if i==0:
            continue
        Room[table2.row_values(i)[3]]= table2.row_values(i)[9]
    #print (Room)
    return Room

def RoomSee(Room):
    nodes=[]
    for i in Room:   
        nodes.append({"name":i,"symbolSize":5})        
    #print (nodes)
    links=[]

    for i in Room:
        for j in Room:
             if i!=j and Room[i]==Room[j]:
                 links.append({"source":i,"target":j})
    print(links) 
    linkstemp=links
    for i in links:
             
        for j in linkstemp:
             
            if i["target"]==j["source"]:
               linkstemp.remove(j)
               break
    #print(linkstemp)
    graph=Graph("关系图",width="1000px",height="1200px")
    graph.add("",nodes,links,categories=None ,is_focusnode=True,is_roam=True,color="#008080",is_rotatelabel=True ,
              graph_layout="force",graph_edge_1ength=120,graph_gravity=0.1,graph_repulsion=150,
              is_label_show=True, line_curve=1)
    graph. render("软件18级寝室关系图.html")

RoomSee(getRoom("E:\Pythonsoft\数据分析编程需要的文件\软件18学生详细名单.xls"))

4.折线图
可以用来分析某人成绩各个学期的变化
在这里插入图片描述

from pyecharts import Pie
from pyecharts import Line
import xlrd
import csv
#1.读取xls文件,把性别信息读取出来
def getGrade(filename,index):
       workbook=xlrd.open_workbook(filename)
       sheet1=workbook.sheet_by_index(0)
       grade1=[]
       grade1.append(sheet1.cell(index, 11).value)
       grade1.append(sheet1.cell(index, 12).value)
       grade1.append(sheet1.cell(index, 13).value)
       grade1.append(sheet1.cell(index, 14).value)
       grade1.append(sheet1.cell(index, 15).value)   
       return grade1
       #return grade1
def VisualSexpyechart(grade1,grade2,grade3):
    line = Line(title = "成绩表",width = 600,height = 420)
    attr = ['第一个学期','第二个学期','第三个学期','第四个学期','第五个学期']
    line.add('A',attr,grade1)
    line.add('B',attr,grade2)
    line.add('C',attr,grade3)
    line.show_config()
    line.render(path="折线图.html")
VisualSexpyechart(getGrade("软件18学生详细名单.xls",28),getGrade("软件18学生详细名单.xls",30),getGrade("软件18学生详细名单.xls",31))

5.地图可视化分析
安装

pip install echarts-countries-pypkg     
pip install echarts-china-provinces-pypkg 
pip install echarts-china-cities-pypkg 
pip install echarts-china-counties-pypkg
pip install echarts-china-misc-pypkg
pip install echarts-united-kingdom-pypkg

根据提前统计的表格中同学的家乡信息,在中国地图上显示。
在这里插入图片描述

#功能:软件181班同学家乡具体城市数据可视化
from pyecharts import Geo
import sys
from pyecharts import Map
import xlrd
import collections
def getInfo(filename):
    lstdata=[]
    data = xlrd.open_workbook(filename,'r',encoding_override='utf-8')
    table1 = data.sheets()[0] # 软件181
    table2 = data.sheets()[1] # 软件182
    rows1 = table1.nrows 
    rows2 = table2.nrows
    for i in range(rows1):
        if i==0:
            continue
        lstdata.append(table1.row_values(i)[7])
    for i in range(rows2):
        if i==0:
            continue
        lstdata.append(table1.row_values(i)[7])
    print(lstdata)
    return lstdata
def VisualCitycharts(lstcity):
    lstcitynew=[]
    for i in lstcity:
        if i=="":pass
        else:lstcitynew.append(i)
    data=collections.Counter(lstcitynew).most_common(100)
    print(data)
    geo=Geo('18级软件同学具体城市分布',"",title_color="#333",title_pos="center",title_text_size=24,           title_top=20,width=1200,height=600,background_color="#FFFFFF")
    attr,value=geo.cast(data)
    print(data)
    print(value)
    for i,a in enumerate(attr):
            if a=="延边":attr[i]="延吉"
geo.add("",attr,value,type="effectScatter",visual_text_color='#fff',visual_range=[0,100],symbol_size=8,
            is_visualmap=True,is_piecewise=True,maptype='china',geo_normal_color="#CCFF99",geo_emphasis_color='#F5D0A9',
            effect_scale=5)  
    geo.render("软件18级城市地图.html")
VisualCitycharts(getInfo("E:\Pythonsoft\数据分析编程需要的文件\软件18学生详细名单.xls"))

6.微信签名词云分析:
在这里插入图片描述

import jieba
import numpy as np 
import matplotlib.pyplot as plt 
from PIL import Image 
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
 
text_road=str(input('请输入文章的路径:'))
picture_road=str(input('请输入图片的路径:'))
 
#加载需要分析的文章
text = open(text_road,'r',encoding='utf-8').read()
 
#对文章进行分词
wordlist_after_jieba = jieba.cut(text, cut_all=False)
wl_space_split = " ".join(wordlist_after_jieba)
 
#读取照片通过numpy.array函数将照片等结构数据转化为np-array
mask=np.array(Image.open(picture_road))
 
#选择屏蔽词,不显示在词云里面
stopwords = set(STOPWORDS)
#可以加多个屏蔽词
stopwords.add("<br/>")
 
#创建词云对象
wc = WordCloud(
    background_color="white",
    font_path='/Library/Fonts/Arial Unicode.ttf',
    max_words=1000, # 最多显示词数
    mask=mask, 
    stopwords=stopwords,
    max_font_size=100 # 字体最大值
    )
#生成词云
wc.generate(text)
#从背景图建立颜色方案
image_colors =ImageColorGenerator(mask) 
#将词云颜色设置为背景图方案
wc.recolor(color_func=image_colors) 
#显示词云
plt.imshow(wc,interpolation='bilinear')
#关闭坐标轴
plt.axis("off")
#显示图像
plt.show()
 
#保存词云
wc.to_file('词云图.png')

7.情感柱状图分析
根据朋友圈朋友的个性签名,分析其情感状态是积极还是低落。
在这里插入图片描述
import xlrd
from pyecharts.charts import Bar
from snownlp import SnowNLP
from pyecharts import options as opts

def fenxi():
motion1 = []
motion2 = []
lstdata1 = []
lstdata2 = []
lst = []
for i in range(1, 36):
lst.append(i)
for line in open(’./sign.txt’, ‘r’):
lstdata1.append(line)
for ld in lstdata1:
motion1.append(SnowNLP(ld).sentiments)
for line in open(‘sign2.txt’, ‘r’):
lstdata2.append(line)
for ld in lstdata2:
motion2.append(SnowNLP(ld).sentiments)
bar = (
Bar()
.add_xaxis(lst)
.add_yaxis(“181”, motion1)
.add_yaxis(“182”, motion2)
.set_global_opts(title_opts=opts.TitleOpts(title=“18级情感对比图”))
)
bar.render(“18对比图.html”)

fenxi()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值