前言
毕业设计里要用到neo4j和柱状图来对数据进行可视化,踩了几天坑,今天填一下。
Neo4J
这是一个图像数据库,接触到这东西发现挺有意思的,比学MySQL有意思多了。
安装
1,从官网下载,但是速度奇慢,可能需要搭梯子。
2,当然是百度搜一搜了,反正挺多的,要么可以用我这个(链接:https://pan.baidu.com/s/1FUmJsA_6UR6Kgkrs7f_OMQ
提取码:5t06),适用于JDK1.8
下载好安装包之后,解压到某一个目录,如果跟我一样只进行简单的可视化那不需要修改什么东西,至于部署在服务器上我们这里不谈。
在这之后,需要用命令行打开CMD,因为运行的脚本里面有用到PowerShell,而这个一般在C盘的系统目录里面,如果报了找不到PowerShell,
先检查是不是环境变量的问题,再检查是不是没装,一般是前者的问题。
这些准备就绪,切换到neo4j的bin目录之后,运行
neo4j.bat console
检查
浏览器输入http://localhost:7474/,如果有neo4j界面出来即可。
Neo4J
在neo4j主要是体现出各个节点之间的关系,所以主要有Node和Relationship这两个对象。
python中操作neo4j可以使用pyneo这个module,pip install就完事了。
这里我要可视化的例子是大学的名字,大学的名字全部存放在一个txt的文件中,然后他们同属于“大学”这个分类。
代码也不是很复杂,按行读取大学名称,然后创建节点和关系等。
# coding:utf-8 from py2neo import Graph,Node,Relationship if __name__=="__main__": # 连接数据库 graph = Graph("http://localhost:7474", username="neo4j", password="1998") # 文件流 fr = open("../data/college.txt",'r',encoding="utf-8") # 分类节点 college = Node("分类",name="大学") graph.create(college) for i in fr.readlines(): # 每个大学的节点 u = Node("大学名字",name=i) graph.create(u) # 和分类节点的关系 relationship = Relationship(college,"大学",u) graph.create(relationship)
再去看看效果:
使用python画柱状图
这里需要可视化的是学校开设的课程的平均的分数,需要用到课程表和成绩表,先从课程表找到对应的学校开设的课程,然后
再查找成绩表中对应的课程的评分。
主要注意的柱状图参数的设置,比如间隔,Y轴的起始刻度字号等等。
import pymysql import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator def pltImage(schoolname,score,course,imageDir): # 中文显示 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # XY轴标题 plt.xlabel('课程',fontsize=12) plt.ylabel("平均分",fontsize=12) # 刻度字体大小5 plt.tick_params(labelsize=5) # 标题 XY轴 label = schoolname loc = 'left' font_dict = {'fontsize': 14, \ 'fontweight': 8.2, \ 'verticalalignment': 'baseline', \ 'horizontalalignment': loc} plt.title(label, fontdict=font_dict, loc=loc) # X字体倾斜30度 plt.xticks(rotation=30) # 设置间隔 xLocator = MultipleLocator(10) ax = plt.gca() ax.xaxis.set_major_locator(xLocator) # 数据 plt.bar(range(len(course)), score, color='rgb', tick_label=course) # 保存到某个目录 plt.savefig(imageDir + schoolname + '.jpg') plt.show() if __name__ == "__main__": # 数据库连接 connection = pymysql.connect( "localhost", "root", "1998", "graduate" ) cursor = connection.cursor() # 根据学校缩写得到学校开设的各个科目的平均分 制成柱状图 # 从schoolShortName取出学校缩写的集合 fr = open("../output/schoolShortName",'r',encoding='utf-8') schoolname = [] for i in fr.readlines(): schoolname.append(i.split("-")[0]) # 遍历 for i in schoolname: # 一个学校的课程列表 resultSet = getCoursesBySchoolName(i) courseList = [] discussCountList = [] schoolName = "" for j in resultSet: temp2 = getCourseDiscussCount(j[0]) schoolName = j[2] if temp2 != None: courseList.append(j[1]) discussCountList.append(temp2) if len(courseList) != 0: pltImage(schoolName,discussCountList,courseList,"../CourseDiscuss/")
效果如图: