使用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/")

效果如圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章