使用Matplotlib繪製不同顏色的帶箭頭的線例項
阿新 • • 發佈:2020-04-18
週五的時候計算出來一條線路,但是計算出來的只是類似與
0->10->19->2->..0
這樣的線路只有寫程式碼的人才能看的懂無法直觀的表達出來,讓其它同事看的不清晰,所以考慮怎樣直觀的把線路圖畫出來。
&esp; 當然是考慮用matplotlib了,
匯入相關的庫
import matplotlib.pyplot as plt import numpy import matplotlib.colors as colors import matplotlib.cm as cmx
後面兩個主要是用於處理顏色的。
準備資料
_locations = [ (4,4),# depot (4,# unload depot_prime (4,# unload depot_second (4,# unload depot_fourth (4,# unload depot_fifth (2,0),(8,# locations to visit (0,1),(1,(5,2),(7,(3,3),(6,5),6),(2,7),(0,8),8) ]
畫圖
plt.figure(figsize=(10,10)) p1 = [l[0] for l in _locations] p2 = [l[1] for l in _locations] plt.plot(p1[:6],p2[:6],'g*',ms=20,label='depot') plt.plot(p1[6:],p2[6:],'ro',ms=15,label='customer') plt.grid(True) plt.legend(loc='lower left') way = [[0,12,18,17,16,4,14,10,11,13,5],[0,6,9,8,20,3],19,21,15,7,2]] # cmap = plt.cm.jet cNorm = colors.Normalize(vmin=0,vmax=len(way)) scalarMap = cmx.ScalarMappable(norm=cNorm,cmap=cmap) for k in range(0,len(way)): way0 = way[k] colorVal = scalarMap.to_rgba(k) for i in range(0,len(way0)-1): start = _locations[way0[i]] end = _locations[way0[i+1]] # plt.arrow(start[0],start[1],end[0]-start[0],end[1]-start[1],length_includes_head=True,# head_width=0.2,head_length=0.3,fc='k',ec='k',lw=2,ls=lineStyle[k],color='red') plt.arrow(start[0],head_width=0.2,color=colorVal) plt.show()
cmap = plt.cm.jet cNorm = colors.Normalize(vmin=0,cmap=cmap)
cmap可以理解為顏色庫,cNorm設定顏色的範圍,有幾條線路就設定幾種顏色,scalarMap顏色生成完畢。最後在繪圖的時候,根據索引獲得相應的顏色就可以了。
結果如下:
補充知識:Python包matplotlib繪圖--如何標註某點--附程式碼
# -*- coding: utf-8 -*- import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np plt.style.use('classic') plt.rcParams['font.sans-serif'] = ['SimHei'] #解決中文顯示 plt.rcParams['axes.unicode_minus'] = False #解決符號無法顯示 x=np.array([1,2,3,5,8]) y1=np.array([3,35,300,800,600,1200,4000]) y2=np.array([8,94,703,1300,1660,2801,12768]) fig1 = plt.figure() ax = plt.axes() ax.plot(x,y2,label='時間/秒') ax.set(xlabel='目標函式個數',ylabel='程式執行時間',title='多目標收斂速度') plt.hlines(703,colors='r',linestyle="--") plt.text(0,"703") plt.hlines(1300,colors='g',"1300") # annotate plt.annotate("703秒",(4,703),xycoords='data',xytext=(4.2,2000),arrowprops=dict(arrowstyle='->')) plt.annotate("94秒",94),xytext=(3.5,arrowprops=dict(arrowstyle='->')) plt.annotate("14秒",14),xytext=(2.5,arrowprops=dict(arrowstyle='->')) plt.annotate("8秒",xytext=(1.5,arrowprops=dict(arrowstyle='->')) plt.legend() plt.show() fig1.savefig('my_figure1.png')
import numpy as np from matplotlib import pyplot as plt from matplotlib.path import Path from matplotlib.patches import PathPatch # Use seaborn to change the default graphics to something nicer import seaborn as sns # And set a nice color palette sns.set_color_codes('deep') # Create the plot object fig,ax = plt.subplots(figsize=(5,4)) x = np.linspace(0,1000) # Add finishing constraint: x2 <= 100/2 - x1/2 plt.plot(x,50/4 - 3*x/4,linewidth=3,label='First constraint') plt.fill_between(x,100/2 - x/2,alpha=0.1) # Add carpentry constraint: x2 <= 80 - x1 plt.plot(x,30 - 2*x,label='Second constraint') plt.fill_between(x,100 - 2*x,alpha=0.1) # Add non-negativity constraints plt.plot(np.zeros_like(x),x,label='$x$ Sign restriction') plt.plot(x,np.zeros_like(x),label='$y$ Sign restriction') #==================================================== # This part is different from giapetto_feasible.py # Plot the possible (x1,x2) pairs pairs = [(x,y) for x in np.arange(101) for y in np.arange(101) if (300*x + 400*y) <= 5000 and (200*x + 100*y) <= 3000] # Split these into our variables chairs,tables = np.hsplit(np.array(pairs),2) # Caculate the objective function at each pair z =8*chairs + 9*tables # Plot the results plt.scatter(chairs,tables,c=z,cmap='jet',edgecolor='gray',alpha=0.5,label='Profit at each point',zorder=3) # Colorbar cb = plt.colorbar() cb.set_label('Profit Colormap ($)') #==================================================== # Labels and stuff plt.xlabel('Package A') plt.ylabel('Package B') plt.xlim(-0.5,20) plt.ylim(-0.5,20) plt.legend() fig01 = plt.figure() plt.show()
以上這篇使用Matplotlib繪製不同顏色的帶箭頭的線例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。