前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

荔枝 | 作者

Crossin的编程教室 | 来源

1. 需求

做股票分析的朋友经常会见到类似这种的期货公司持仓榜单图:

这种图就是棒棒糖图。也就是我们今天文章的目标:

绘制出期货持仓榜单的棒棒糖图

图中线的两端是圆点或者菱形,旁边都有标注持仓证券商和相对应的持多仓数或持空仓数,且左右线颜色不同。画图思路大体就是:先画水平线图,再用 scatter 散点图画线左右两端的点,然后标注两端名称,以及标题和注解。

Python 中比较常用的两种图表库是 matplotlib 和 plotly。上图就是以 matplotlib 绘制。而 Plotly 交互性更好。

更进一步,如果想让用户可以点击选择交易日期,查看该日期对应的榜单图,这就可以通过一个响应式 web 应用程序来实现。Dash 是一个基于 python 的交互式可视化 web 应用框架,matplotlib 和 Plotly 都可与 Dash 框架结合使用。

Matplotlib 大家比较熟悉。在开始之前,我们先简单介绍下 plotly 和 Dash。

2. Plotly

plotly 库(plotly.py)是一个交互式的开源绘图库,支持40多种独特的图表类型,涵盖各种统计,财务,地理,科学和三维用例,是适用于Python,R 和 JavaScript 的交互式图表库。

plotly.py 建立在 Plotly JavaScript 库(plotly.js)之上,使Python用户可以创建基于 Web 的漂亮交互式可视化效果。这些可视化效果可以显示在 Jupyter 笔记本中,可以保存到独立的 HTML 文件中,也可以作为纯 Python 使用。其官方文档上提供了各种图标的接口说明。

3. Dash

Dash 是用于构建 Web 应用程序的 Python 框架。Dash 建立在 Flask、Plotly.js 和 React.js 基础之上,即 Dash 中的控件和其触发事件都是用 React.js 包装的,Plotly.js 为 Dash 提供强大的交互式数据可视化图库,Flask 为其提供后端框架。这个框架对 python 程序员特别友好,只需要写 python 代码,不需要写 JS 代码,直接拖拽控件来用即可。感兴趣的童鞋可以去 Dash 的官方文档多多了解一下。Dash 是使用纯 Python 构建高度自定义用户界面的数据可视化应用程序的理想选择。它特别适合做数据分析、数据可视化以及仪表盘或者报告展示。可以将 Dash 应用程序部署到服务器,然后通过 URL 共享它们,不受平台和环境的限制。

4. 安装

在画图之前,我们需要装一下 Dash、plotly 相关包。可以用 pip 装:

pip install plotly dash
或者也可以用 conda 进行安装。

5. 数据格式和数据处理

测试数据来自东方财富网,用 csv 文件格式保存。

数据的格式如下,header 是日期为第一列,第3列往后为期货公司名字。表格中的负数是上面图中蓝色的空仓,正数是红色的多仓。绘图时,从表格中取出某一日期的一行记录,将持仓数目排序,把对应的数据存入列表中,之后进行画图。

首先对数据进行清洗和处理, pandas读取数据,这里需要去除 000905_SH 列,以及删除全0行。代码如下:

excel_pd = pd.read_excel('data/IC期货商历史数据(1).xlsx', index_col='日期')
# 去空
excel_pd.dropna()
# 去除000905_SH列
excel_pd = excel_pd.drop(labels='000905_SH', axis=1)
# 去0行
excel_pd = excel_pd[~(excel_pd == 0).all(axis=1)]
# 取出时间列表,获取最大日期和最小日期,为日历选项做判断
date_list = excel_pd.index.values.tolist()
min_date = min(date_list)
max_date = max(date_list)

接下来我们需要根据输入的日期来筛选某一行记录,分别将持空仓期货公司和持多仓期货公司取出,剔除持仓数为0的期货公司。代码如下:

def get_data_via_date_from_excel(date):# 筛选日期sheet1_data = excel_pd.loc[date]# 去除列值为0sheet1_data = sheet1_data[sheet1_data != 0]# 排序 从小到大sheet1_data = sheet1_data.sort_values()# 空仓short_hold = sheet1_data[sheet1_data < 0]# 多仓long_hold = sheet1_data[sheet1_data >= 0].sort_values(ascending=False)return short_hold, long_hold

6. 画图

Matplotlib画图

创建一张画布figure和ax画图层,用ax.hlines分别画空仓水平线和多仓水平线。用ax.scatter画左右两边线的散点,使用菱形marker。使用plt.text分别画线两端的标注期货公司和持仓数。plt.annotate画排名标注,分别设置颜色和字体大小。

但这个效果是反的,我们是希望排名最前面的在上,排名最后面的下。这时我们可以设置y轴反置一下ax.invert_yaxis()。添加图例和标题以及设置坐标轴不可见,得到最终效果:

核心代码如下:

def draw_lollipop_graph(short_hold, long_hold, date):# sheet_major.index.values.tolist()fig, ax = plt.subplots(figsize=(10, 8))# 空仓水平线ax.hlines(y=[i for i in range(len(short_hold))], xmin=list(short_hold), xmax=[0] * len(short_hold.index), color='#1a68cc', label='空')# 多仓水平线ax.hlines(y=[i for i in range(len(long_hold))], xmax=list(long_hold), xmin=[0] * len(long_hold.index), color='red', label='多')# 画散点ax.scatter(x=list(short_hold), y=[i for i in range(len(short_hold))], s=10, marker='d', edgecolors="#1a68cc", zorder=2, color='white')  # zorder设置该点覆盖线ax.scatter(x=list(long_hold), y=[i for i in range(len(long_hold))], s=10, marker='d', edgecolors="red", zorder=2, color='white')  # zorder设置该点覆盖线# 画线两端标注图for x, y, label in zip(list(short_hold), range(len(short_hold)), short_hold.index):plt.text(x=x, y=y, s=label+'({}) '.format(abs(x)), horizontalalignment='right', verticalalignment='center', fontsize=10)for x, y, label in zip(list(long_hold), range(len(long_hold)), long_hold.index):plt.text(x=x, y=y, s=' '+label+'({})'.format(abs(x)), horizontalalignment='left', verticalalignment='center', fontsize=10)# 设置排名size = [17, 16, 15] + [8 for i in range(max(len(short_hold), len(long_hold))-3)]color = ['#b91818', '#e26012', '#dd9f10'] + ['#404040' for i in range(max(len(short_hold), len(long_hold))-3)]for i, s, c in zip(range(max(len(short_hold), len(long_hold))+1), size, color):plt.annotate(s=i+1, xy=(0, i), fontsize=s, ma='center', ha='center', color=c)# 坐标轴y反置ax.invert_yaxis()# 坐标轴不可见ax.set_xticks([])ax.set_yticks([])ax.spines['top'].set_visible(False)  # 去上边框ax.spines['bottom'].set_visible(False)  # 去下边框ax.spines['left'].set_visible(False)  # 去左边框ax.spines['right'].set_visible(False)  # 去右边框# 设置titleax.set_title('黄金持仓龙虎榜单({})'.format(date), position=(0.7, 1.07), fontdict=dict(fontsize=20, color='black'))# 自动获取ax图例句柄及其标签handles, labels = ax.get_legend_handles_labels()plt.legend(handles=handles, ncol=2, bbox_to_anchor=(0.75, 1.05), labels=labels, edgecolor='white', fontsize=10)# 保存figimage_filename = "lollipop_rank.png"plt.savefig(image_filename)encoded_image = base64.b64encode(open(image_filename, 'rb').read())# plt.show()return encoded_image

plt数据图去边框 python3_Python数据可视化:绘制持仓榜单的“棒棒糖图”相关推荐

  1. [数据可视化]绘制持仓榜单的“棒棒糖图”

    1. 需求 做股票分析的朋友经常会见到类似这种的期货公司持仓榜单图: 这种图就是棒棒糖图.也就是我们今天文章的目标: 绘制出期货持仓榜单的棒棒糖图 图中线的两端是圆点或者菱形,旁边都有标注持仓证券商和 ...

  2. 绘制棒棒糖用python_Python数据可视化:绘制持仓榜单的“棒棒糖图” - 松鼠爱吃饼干...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 荔枝 | 作者 Crossin的编程教室 | 来源 1. 需求 做股票分析 ...

  3. Python数据可视化:绘制持仓榜单的“棒棒糖图”

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 荔枝 | 作者 Crossin的编程教室 | 来源 1. 需求 做股票分析 ...

  4. 人气头像榜单壁纸套图下载流量主微信小程序开发

    人气头像榜单壁纸套图下载流量主微信小程序开发 云开发,小程序免服务器和域,.包括微信和QQ端小程序,本程序包括壁纸下载,头像下载,套图下载,刘海壁纸制作,动态壁纸下载等功能. 功能服务// 微信小程序 ...

  5. #榜样的力量#《新冠战“疫”——中国数据智能产业最具社会责任感企业》榜单正式发布...

    数据猿出品 此次征集评选,源于数据猿推出的<寻找新冠战"疫",中国数据智能产业先锋力量>的公益主题策划活动.数据猿前后联合超过100家媒体的传播力量,为正能量助威,为中 ...

  6. Python疫起学习·万丈高楼平地起Day09(精简版|浓缩就是精华)爬虫知识附上案例爬取北京地区短租房信息、爬取酷狗TOP500的数据以及爬取网易云音乐热歌榜单

    爬虫知识 Requests库 部分运行结果如下: 有时爬虫需要加入请求头来伪装成浏览器,以便更好地抓取数据.在Chrome浏览器中按F12键打开Chrome开发者工具,刷新网页后找到User-Agen ...

  7. 思维导图怎么画:多方法绘制自己喜欢的思维导图技巧

    我们在上班或整理思路的时候,可能会绘制思维导图以便更好地了解整个流程的走向.但是在绘制流程图的时候,很多用户都不知道应该如何绘制才好.那么,接下来就要为大家讲讲怎么通过多个方法来绘制思维导图. 一.直 ...

  8. oracle如何某个字段去重复的数据,Oracle 去重复的数据

    重复的数据分两种,一种是表中部分字段的重复,一种是两行以上的记录完全一样. 部分字段的重复: 查询不重复的数据SQL: select 字段1,字段2,count(*) from 表名 group by ...

  9. 桌面端旗舰显卡/GPU,所有显卡,服务器显卡,加速卡,工作站显卡天梯榜单,天梯图,天梯列表,2023/2/22

    注意:这里仅统计能买到的GPU,部分超算的定制GPU不算在内 顺序:从高到低 NVIDIA OVX SuperPOD(1024L40) NVIDIA DGX H100 256 SuperPOD NVI ...

最新文章

  1. PAT 1041. 考试座位号(15)
  2. 以电商网站为例,谈大型分布式架构设计与优化
  3. Fedora安装Mariadb数据库
  4. 【Python】【数据库】
  5. 对学习java的心得体会1
  6. 12306 辟谣用户信息被卖;比特大陆两 CEO 均卸任?苹果又被起诉 | 极客头条
  7. 理解SpringAOP-菜鸟新手入门
  8. python定时任务管理系统_python定时任务最强框架APScheduler详细教程
  9. 计算机维修技师论文,2016年电工技师论文范文10篇
  10. SQL中的升序和降序
  11. 只有管理得少,才能管理得好
  12. matlab如何求有约束最优化最大值,6.4.2有约束最优化问题的求解-东北大学数学系.ppt...
  13. Abbirb120型工业机器人_工控产品-ABB IRB120工业机器人-IRB120
  14. 关于三极管,我忽视了两点
  15. 【360补天计划】记第一次漏洞提交
  16. zabbix 5系列之snmp监控详解
  17. android os包含那些,os是什么意思(os的基本类型包括哪三种)
  18. 员工管理和激励的十个经典故事
  19. 拒绝平庸 保罗格雷厄姆_保罗·格雷厄姆(Paul Graham):微软无法处理Y组合器
  20. 中国打桩设备行业运行态势与投资前景预测报告(新版)2022-2027

热门文章

  1. 镇三山在此!”三个 水浒传
  2. Matrix Inverse -- 逆矩阵
  3. 华为OD机试 - 字符串分割(Java JS Python)
  4. 监控储存服务器系统,监控储存服务器系统
  5. watchdog之喂狗分析
  6. Icepak打开TZR文件
  7. 2017美国数学建模MCM B题(离散型)翻译 收费后合并 (Merge After Toll)
  8. 【云和恩墨大讲堂】戴明明 - 基于 PCIE 闪存卡的 Oracle 数据库使用
  9. 雪狐html5,【干货】如何实现H5移动端无缝滚动动画
  10. JAVA爬取某房产网房源信息