使用Python操作neo4j和画柱状图

前言

毕业设计里要用到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/")

效果如图:

猜你喜欢

转载自www.cnblogs.com/Yintianhao/p/12541966.html