前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >比较(五)利用python绘制棒棒糖图

比较(五)利用python绘制棒棒糖图

作者头像
HsuHeinrich
发布2024-07-02 12:35:00
1140
发布2024-07-02 12:35:00
举报
文章被收录于专栏:HsuHeinrich

比较(五)利用python绘制棒棒糖图

棒棒糖图(Lollipop plot)简介

棒棒糖图实际上是修饰后的条形图。当在处理大量的值,并且当这些值都很高时,棒棒糖图就很有用。

快速绘制

基于matplotlib

代码语言:javascript
复制
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]了解更多用法

修改参数

代码语言:javascript
复制
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()

水平棒棒糖图

代码语言:javascript
复制
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()

分组棒棒糖图

代码语言:javascript
复制
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()

颜色对比棒棒糖图

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HsuHeinrich 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 比较(五)利用python绘制棒棒糖图
    • 棒棒糖图(Lollipop plot)简介
      • 快速绘制
        • 定制多样化的棒棒糖图
          • 总结
            • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档