Matplotlib雙Y軸折線圖小實例

本文內容為重複 Learning Python: Part 2 – Visualizing the NBA Draft 教程的第二部分內容

簡單注釋

fig,ax1 = plt.subplots(figsize=(12,9))創建畫布,有點類似於ggplot2的ggplot()函數的作用;figsize參數用來控制圖片長和寬,但是單位是啥還沒搞明白

plt.title()添加標題

plt.grid()添加網格axis參數指定坐標軸

plt.tick_params()可以控制坐標軸刻度標籤字體大小labelsize 大小axis坐標軸

ax1.set_ylabel()坐標軸標籤

ax1.set_ylim()坐標軸範圍

ax1.legend()圖例;loc參數指點圖例位置;其他參數還需要仔細研究一下

ax1.set_yticks(0,10,5)坐標軸如何分割

ax1.spines["top"].set_visible(False)邊框

ax1.twinx()生成另外一個坐標軸

fig.text(0.1,0.02,"Text")添加文本內容

小例子
import matplotlib.pyplot as plt  import numpy as np    A = ["a","b","c","d","e"]  B = [5,4,6,3,4]  fig, ax1 = plt.subplots(figsize=(12,9))  ax1.plot(A,B,label="Practice")  plt.title("Example")  ax1.legend()  ax1.grid(axis="y",color="grey",linestyle="--",alpha=0.5)  ax1.tick_params(axis="x",labelsize=30)  ax1.tick_params(axis="y",labelsize=20)  ax1.set_ylabel("Y",fontsize = 18)  ax1.set_xlabel("X",fontsize = 20)  ax1.set_ylim(0,15)  ax1.set_yticks(np.linspace(0,15,16))  for tl in ax1.get_yticklabels():      tl.set_color('r')    ax1.spines['top'].set_visible(False)  fig.text(0.1,0.02,"Author:MingYan")  plt.savefig("Practice.png")  

Practice.png

雙Y軸折線圖

(plot both of those plots in one plot with 2 y-axis labels) 一個Y軸用來展示每年選秀總人數,另一個Y軸用來展示贏球貢獻值的平均值。

導入需要的模組、讀入數據
(如需要下文用到的數據,可至公眾號後台回復管檢測 選秀)
import numpy as np  import pandas as pd  import matplotlib.pyplot as plt      draft_df = pd.read_csv("draft_data_1996_to_2014.csv",index_col=0)    X_values = draft_df.Draft_Yr.unique()  Y_values_1 = draft_df.groupby('Draft_Yr').Pk.count()  Y_values_2 = draft_df.groupby('Draft_Yr').WS_per_48.mean()  
繪圖
fig, ax1 = plt.subplots(figsize=(12,9))  title = ('The Number of Players Drafted and Average Career WS/48nfor each Draft (1966-2014)')  plt.title(title,fontsize=20)  plt.grid(axis='y',color='grey',linestyle='--',lw=0.5,alpha=0.5)  plt.tick_params(axis='both',labelsize=14)  plot1 = ax1.plot(X_values,Y_values_1,'b',label='No. of Players Drafted')  ax1.set_ylabel('Number of Players Drafted', fontsize = 18)  ax1.set_ylim(0,240)  for tl in ax1.get_yticklabels():      tl.set_color('b')  ax2 = ax1.twinx()  plot2 = ax2.plot(X_values,Y_values_2,'g',label='Avg WS/48')  ax2.set_ylabel('Win Shares Per 48 minutes',fontsize=18)  ax2.set_ylim(0,0.08)  ax2.tick_params(axis='y',labelsize=14)  for tl in ax2.get_yticklabels():      tl.set_color('g')  ax2.set_xlim(1966,2014.15)  lines = plot1 + plot2  ax1.legend(lines,[l.get_label() for l in lines])  ax1.set_yticks(np.linspace(ax1.get_ybound()[0],ax1.get_ybound()[1],9))  ax2.set_yticks(np.linspace(ax2.get_ybound()[0],ax2.get_ybound()[1],9))  for ax in [ax1,ax2]:      ax.spines['top'].set_visible(False)      ax.spines['bottom'].set_visible(False)      ax.spines['right'].set_visible(False)      ax.spines['left'].set_visible(False)  fig.text(0.1,0.02,'The original content: http://savvastjortjoglou.com/nba-draft-part02-visualizing.htmlnPorter: MingYan',fontsize=10)  plt.savefig("Line_chart_4.png")  

Line_chart_4.png