一、用matplotlib繪製網絡圖
基本流程:
1. 導入networkx,matplotlib包
2. 創建網絡
3. 繪製網絡 nx.draw()
4. 創建佈局 pos = nx.spring_layout美化做用html
最基本畫圖程序node
import import networkx as nx #導入networkx包 import matplotlib.pyplot as plt G = nx.random_graphs.barabasi_albert_graph(100,1) #生成一個BA無標度網絡G nx.draw(G) #繪製網絡G plt.savefig("ba.png") #輸出方式1: 將圖像存爲一個png格式的圖片文件 plt.show() #輸出方式2: 在窗口中顯示這幅圖像
二、networkx 提供畫圖的函數有:
draw
(G,[pos,ax,hold])draw_networkx
(G,[pos,with_labels])draw_networkx_nodes
(G,pos,[nodelist]) 繪製網絡G的節點圖draw_networkx_edges
(G,pos[edgelist]) 繪製網絡G的邊圖draw_networkx_edge_labels
(G, pos[, ...]) 繪製網絡G的邊圖,邊有label
---有layout 佈局畫圖函數的分界線---draw_circular(G, **kwargs)
Draw the graph G with a circular layout.draw_random(G, **kwargs)
Draw the graph G with a random layout.draw_spectral(G, **kwargs)
Draw the graph G with a spectral layout.draw_spring(G, **kwargs)
Draw the graph G with a spring layout.draw_shell(G, **kwargs)
Draw networkx graph with shell layout.draw_graphviz(G[, prog])
Draw networkx graph with graphviz layout.
三、networkx 畫圖參數:
- node_size
: 指定節點的尺寸大小(默認是300,單位未知,就是上圖中那麼大的點)
- node_color
: 指定節點的顏色 (默認是紅色,能夠用字符串簡單標識顏色,例如'r'爲紅色,'b'爲綠色等,具體可查看手冊),用「數據字典」賦值的時候必須對字典取值(.values())後再賦值
- node_shape
: 節點的形狀(默認是圓形,用字符串'o'標識,具體可查看手冊)
- alpha
: 透明度 (默認是1.0,不透明,0爲徹底透明)
- width
: 邊的寬度 (默認爲1.0)
- edge_color
: 邊的顏色(默認爲黑色)
- style
: 邊的樣式(默認爲實現,可選: solid|dashed|dotted,dashdot)
- with_labels
: 節點是否帶標籤(默認爲True)
- font_size
: 節點標籤字體大小 (默認爲12)
- font_color
: 節點標籤字體顏色(默認爲黑色)
e.g. nx.draw(G,node_size = 30, with_label = False)
繪製節點的尺寸爲30,不帶標籤的網絡圖。python
四、佈局指定節點排列形式
pos = nx.spring_layout
創建佈局,對圖進行佈局美化,networkx 提供的佈局方式有:
- circular_layout:節點在一個圓環上均勻分佈
- random_layout:節點隨機分佈
- shell_layout:節點在同心圓上分佈
- spring_layout: 用Fruchterman-Reingold算法排列節點(這個算法我不瞭解,樣子相似多中心放射狀)
- spectral_layout:根據圖的拉普拉斯特徵向量排列節
佈局也可用pos參數指定,例如,nx.draw(G, pos = spring_layout(G)) 這樣指定了networkx上以中心放射狀分佈.linux
五、按權重劃分爲重權值得邊和輕權值的邊
六、將Matplotlib圖形保存爲全屏圖像
manager = plt.get_current_fig_manager() manager.window.showMaximized()
七、分圖:
plt.figure(1, figsize=(9, 3))
plt.figure(2, figsize=(9, 3))
八、怎麼給plt.subplot加一個主標題?
有suptitle這個函數,專門生成總標題的 plt.figure() plt.suptitle('Main titile', fontsize=14) plt.subplot(1, 2, 1) plt.title('subtitle1') plt.subplot(1, 2, 2) plt.title('subtitle2') plt.show()
九、子圖合併一個圖,不知道數量
lens = len(all_sub_graphs) b = a = int(math.sqrt(lens)) if a*a < lens: b = b+1 plot = plt.subplot(a, b, i+1)
十、matplotlib去掉座標軸刻度
ax.set_axis_off() ax.set_xticks([]) ax.set_yticks([])
十一、label圖例有中文
#coding:utf-8 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號 #有中文出現的狀況,須要u'內容'
十二、設置座標軸
ax = plt.gca() ax.set_xlabel('x-label', fontsize=fontsize) ax.set_ylabel('y-label', fontsize=fontsize) ax.set_title('Title', fontsize=fontsize)
1三、隨機顏色
def random_color(): color_arr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'] color = "" for i in range(6): color += color_arr[random.randint(0, 14)] return "#"+color
1四、解決linux圖片中文亂碼
plt.rcParams['font.sans-serif'] = ['simhei'] # 用來正常顯示中文標籤
還不行就:算法
import os from matplotlib import font_manager as fm, rcParams import matplotlib.pyplot as plt fig, ax = plt.subplots() fpath = os.path.join(rcParams["datapath"], "D:/Anaconda3/Lib/site-packages/matplotlib\mpl-data/fonts/ttf/simhei.ttf") prop = fm.FontProperties(fname=fpath) fname = os.path.split(fpath)[1] ax.set_title(u'中文出來This is a special font: {}'.format(fname), fontproperties=prop) ax.set_xlabel('This 急急急 the default font', fontproperties=prop) plt.savefig("chinese.png")
圖例:spring
plt.legend(loc="best", prop=prop)
1五、畫垂直虛線
vlines(x, ymin, ymax)
hlines(y, xmin, xmax)
plt.vlines(x-values, -5, 100, colors="#808080", linestyles="dashed", label="baseline")
1六、圖例位置
plt.legend(handles = [l1, l2,], labels = ['a', 'b'], loc = 'best')
除'best',另外loc屬性有:'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center'shell
1七、python中關於圖例legend在圖外的畫法簡析
ax1 = plt.gca() box = ax1.get_position() ax1.set_position([box.x0, box.y0, box.width , box.height* 0.8]) ax1.legend(loc='center left', bbox_to_anchor=(0.2, 1.12),ncol=3)