前言
畢業設計裏要用到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/")
效果如圖: