棒棒糖图实际上是修饰后的条形图。当在处理大量的值,并且当这些值都很高时,棒棒糖图就很有用。
基于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[1]了解更多用法
修改参数
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
(散点)构造各种各样的棒棒糖图。
共勉~
[1]
matplotlib.pyplot.stem: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.stem.html