import requests import json import pandas as pd import matplotlib.pyplot as plt # 设置 Matplotlib 使用的中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 选择合适的中文字体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 def get_fund_flow_data(): """获取资金流向数据""" url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery112309006219872217847_1740232310161&fid=f62&po=1&pz=50&pn=1&np=1&fltt=2&invt=2&ut=8dec03ba335b81bf4ebdf7b29ec27d15&fs=m%3A90+t%3A2&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', } try: response = requests.get(url, headers=headers) # 去除 JSONP 格式中的回调函数部分 response_text = response.text[response.text.find('(') + 1: response.text.rfind(')')] data = json.loads(response_text) if 'data' not in data or 'diff' not in data['data']: raise Exception("未能获取到数据") items = data['data']['diff'] parsed_data = [] for item in items: # 获取增仓数据 increase_position = item['f72'] # 假设你想加入的另一个数据项,比如资金流入(这里只做示范) fund_inflow = item['f62'] # 可以根据实际需要更改为其他数据字段 parsed_data.append({ '板块': item['f14'], # 板块名称 '增仓': increase_position, # 增仓值 '资金流入': fund_inflow # 假设另一个对比数据 }) # 将数据转为DataFrame df = pd.DataFrame(parsed_data) # 按增仓排序 df_sorted = df.sort_values(by='增仓', ascending=False) return df_sorted except Exception as e: print(f"获取数据时发生错误: {str(e)}") return None def plot_combined_chart(data): """绘制增仓排名的柱状图与折线图结合""" # 获取前10个板块及其增仓数据 sectors = data['板块'].tolist()[:10] increase_positions = data['增仓'].tolist()[:10] fund_inflows = data['资金流入'].tolist()[:10] # 资金流入作为对比数据 # 创建一个图形 fig, ax1 = plt.subplots(figsize=(12, 7)) # 绘制增仓值的柱状图 ax1.bar(sectors, increase_positions, color='b', alpha=0.6, label='增仓值', width=0.4) # 设置柱状图的Y轴标签 ax1.set_xlabel('板块', fontsize=14) ax1.set_ylabel('增仓值', fontsize=14, color='b') ax1.tick_params(axis='y', labelcolor='b') # 创建第二个Y轴来绘制折线图 ax2 = ax1.twinx() ax2.plot(sectors, increase_positions, color='r', marker='o', label='增仓趋势', linewidth=2) # 添加资金流入的折线 ax2.plot(sectors, fund_inflows, color='g', marker='^', label='资金流入', linewidth=2) # 设置折线图的Y轴标签 ax2.set_ylabel('趋势值', fontsize=14, color='r') ax2.tick_params(axis='y', labelcolor='r') # 设置标题 plt.title('增仓与资金流入对比 - 柱状图与折线图结合', fontsize=16) # 显示图形 plt.xticks(rotation=45) # 使X轴标签旋转,防止重叠 fig.tight_layout() # 自动调整布局,防止标签被遮挡 # 添加图例 ax1.legend(loc='upper left') ax2.legend(loc='upper right') plt.show() def main(): # 获取数据并计算 print("正在获取资金流向数据...") data = get_fund_flow_data() if data is not None: print("正在生成增仓与资金流入对比的柱状图与折线图结合...") plot_combined_chart(data) else: print("获取数据失败,请检查网络连接或接口可用性。") if __name__ == "__main__": main()