比較(五)利用python繪制棒棒糖圖
棒棒糖圖(Lollipop plot)簡介
棒棒糖圖實際上是修飾后的條形圖。當在處理大量的值,并且當這些值都很高時,棒棒糖圖就很有用。
快速繪制
-
基于matplotlib
import pandas as pd import numpy as np import matplotlib.pyplot as plt# 自定義數據 df = pd.DataFrame({'group':list(map(chr, range(65, 85))), 'values':np.random.uniform(size=20) })# 按值重新排序 ordered_df = df.sort_values(by='values') my_range=range(1,len(df.index)+1)# 利用stem(莖葉圖)快速繪制 plt.stem(ordered_df['values']) plt.xticks( my_range, ordered_df['group'])plt.show()
定制多樣化的棒棒糖圖
自定義棒棒糖圖一般是結合使用場景對相關參數進行修改,并輔以其他的繪圖知識。參數信息可以通過官網進行查看,其他的繪圖知識則更多來源于實戰經驗,大家不妨將接下來的繪圖作為一種學習經驗,以便于日后總結。
matplotlib主要利用stem
繪制棒棒糖圖,可以通過matplotlib.pyplot.stem了解更多用法
-
修改參數
import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽# 自定義數據 values = np.random.uniform(size=50)# 初始化布局 fig = plt.figure(figsize=(12,6))# 隱藏標記 plt.subplot(2, 3, 1) plt.stem(values, markerfmt=' ', bottom=0.5) plt.title('隱藏標記')# 隱藏基線 plt.subplot(2, 3, 2) plt.stem(values, basefmt=" ") plt.title('隱藏基線')# 自定義基線位置 plt.subplot(2, 3, 3) plt.stem(values, markerfmt=' ', bottom=0.5) plt.title('自定義基線位置')# 通過獲取stem返回值獲取(markers, stemlines, baseline),并進行自定義操作 # 獲取markers并自定義標記 plt.subplot(2, 3, 4) (markers, stemlines, baseline) = plt.stem(values) plt.setp(markers, marker='D', markersize=10, markeredgecolor="orange", markeredgewidth=2) plt.title('獲取markers并自定義標記')# 獲取baseline并自定義基線 plt.subplot(2, 3, 5) (markers, stemlines, baseline) = plt.stem(values) plt.setp(baseline, linestyle="-", color="grey", linewidth=6) plt.title('獲取baseline并自定義基線')# 獲取baseline并自定義莖葉 plt.subplot(2, 3, 6) (markers, stemlines, baseline) = plt.stem(values) plt.setp(stemlines, linestyle="-", color="olive", linewidth=0.5 ) plt.title('獲取baseline并自定義莖葉')plt.tight_layout() plt.show()
-
水平棒棒糖圖
import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽# 自定義數據 df = pd.DataFrame({'group':list(map(chr, range(65, 85))), 'values':np.random.uniform(size=20) })# 按值重新排序 ordered_df = df.sort_values(by='values') my_range=range(1,len(df.index)+1)# 自定義需要重點突出的數據 my_color=np.where(ordered_df ['group']=='B', 'orange', 'skyblue') my_size=np.where(ordered_df ['group']=='B', 70, 30)# 初始化布局 fig = plt.figure(figsize=(12,4))# 水平棒棒糖圖 plt.subplot(1, 2, 1) plt.hlines(y=my_range, xmin=0, xmax=ordered_df['values'], color='skyblue') plt.plot(ordered_df['values'], my_range, "o") plt.yticks(my_range, ordered_df['group']) plt.title('水平棒棒糖圖')# 水平棒棒糖圖-Highlight plt.subplot(1, 2, 2) plt.hlines(y=my_range, xmin=0, xmax=ordered_df['values'], color=my_color, alpha=0.4) plt.scatter(ordered_df['values'], my_range, color=my_color, s=my_size, alpha=1) plt.yticks(my_range, ordered_df['group']) plt.title('水平棒棒糖圖-Highlight')plt.show()
-
分組棒棒糖圖
import numpy as np import pandas as pd import matplotlib.pyplot as plt# 自定義數據 value1=np.random.uniform(size=20) value2=value1+np.random.uniform(size=20)/4 df = pd.DataFrame({'group':list(map(chr, range(65, 85))), 'value1':value1 , 'value2':value2 })# 重新排序 ordered_df = df.sort_values(by='value1') my_range=range(1,len(df.index)+1)# 繪制水平棒棒糖圖 plt.hlines(y=my_range, xmin=ordered_df['value1'], xmax=ordered_df['value2'], color='grey', alpha=0.4) plt.scatter(ordered_df['value1'], my_range, color='skyblue', alpha=1, label='value1') plt.scatter(ordered_df['value2'], my_range, color='green', alpha=0.4 , label='value2') plt.legend()# 標題、軸標簽 plt.yticks(my_range, ordered_df['group']) plt.title("Comparison of the value 1 and the value 2", loc='left') plt.xlabel('Value of the variables') plt.ylabel('Group')plt.show()
-
顏色對比棒棒糖圖
import matplotlib.pyplot as plt import numpy as np import seaborn as sns# 自定義數據 x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) + np.random.uniform(size=len(x)) - 0.2# 自定義顏色:正值為橘色 my_color = np.where(y>=0, 'orange', 'skyblue')# 繪制棒棒糖圖 plt.vlines(x=x, ymin=0, ymax=y, color=my_color, alpha=0.4) plt.scatter(x, y, color=my_color, s=1, alpha=1)# 標題、軸標簽 plt.title("Evolution of the value of ...", loc='left') plt.xlabel('Value of the variable') plt.ylabel('Group')plt.show()
總結
以上通過matplotlib的stem
快速繪制棒棒糖圖,也可以利用matplotlib的vlines
(垂直線)+scatter
(散點)構造各種各樣的棒棒糖圖。
共勉~