如何绘制以年份为X轴、城市为Y轴的数值尺寸散点图(Python/Excel)
Python 实现方案
步骤1:数据格式转换
你的原始DataFrame是宽格式(行是城市、列是年份),需要先转成长格式才能适配散点图的输入要求:
import pandas as pd import matplotlib.pyplot as plt # 模拟你的数据(已有DataFrame可跳过此段) sample_data = { 2015: [12, 34, 56], 2016: [23, 45, 67], 2017: [34, 56, 78] } df = pd.DataFrame(sample_data, index=["北京", "上海", "广州"]) # 转长格式 df_long = df.reset_index().melt( id_vars="index", var_name="年份", value_name="数值" ).rename(columns={"index": "城市"})
步骤2:绘制散点图
用matplotlib直接实现,或者用seaborn简化代码:
方式1:Matplotlib
plt.figure(figsize=(10, 6)) # 给每个城市分配Y轴位置(分类变量转数值坐标) city_y_pos = {city: idx for idx, city in enumerate(df_long["城市"].unique())} # 绘制散点,s参数控制大小,乘以系数调整视觉效果 plt.scatter( x=df_long["年份"], y=df_long["城市"].map(city_y_pos), s=df_long["数值"] * 12, alpha=0.7, color="#3377bb" ) # 配置坐标轴与样式 plt.xlabel("年份") plt.ylabel("城市") plt.title("城市-年份数值散点图") plt.yticks(list(city_y_pos.values()), list(city_y_pos.keys())) plt.tight_layout() plt.show()
方式2:Seaborn(更简洁)
import seaborn as sns sns.scatterplot( data=df_long, x="年份", y="城市", size="数值", sizes=(60, 600), alpha=0.7, color="#3377bb" ) plt.title("城市-年份数值散点图") plt.tight_layout() plt.show()
Excel 实现方案
步骤1:数据逆透视(宽转长)
- 将原始表格的行索引(城市)转为单独一列,比如A列填城市名,B列起为各年份数值;
- 选中全量数据,点击「数据」→「从表格/区域」(Excel 2016+支持),进入Power Query编辑器;
- 选中「城市」列,点击「转换」→「逆透视列」→选择所有年份列,完成后关闭并上载数据,得到「城市/年份/数值」三列的长格式数据。
步骤2:绘制散点图
- 选中逆透视后的三列数据,点击「插入」→「散点图」→「仅带数据标记的散点图」;
- 右键散点→「设置数据系列格式」,在「系列选项」中勾选「大小」,关联到「数值」列,实现散点大小随数值变化;
- 右键Y轴→「设置坐标轴格式」,在「坐标轴选项」→「标签」中选择「自定义」,输入城市列表替换默认刻度;
- 调整图表标题、坐标轴标签等样式即可。
内容的提问来源于stack exchange,提问作者Cyne
相关产品推荐
相关产品推荐

