比较(五)利用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 np plt.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 np plt.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
(散点)构造各种各样的棒棒糖图。
共勉~