数据可视化,简单来说就是在项目初期开始进行探索性的数据分析,这样方便整体对数据有一定的了解。其中最直观的就是采用数据可视化技术,这样,数据不仅一目了然,而且更容易被解读。同样在数据分析得到结果之后,我们还需要用到可视化技术,把最终的结果呈现出来。
如何做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()