You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib字符串X轴多散点图报错:无法将字符串转为浮点数

Matplotlib散点图报错:could not convert string to float: 'lo' 原因及解决方法

我尝试使用Matplotlib在一个画布中绘制三个散点图,编写的代码如下:

import matplotlib.pyplot as plt
c_pop = [0.410, -0.094, -0.111, -0.106, -0.090, 0.070, -0.043, -0.181, 0.221]
c_labels = ['ll120', 'll123', 'll124', 'll27', 'll28', 'll30', 'll446, n12', 'll447, n86', 'll471']
pre_lo = [-0.493]
post_lo = [0.145]
lo_label = ['lo']
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.scatter(c_labels, c_pop, color='black')
ax1.scatter(lo_label, pre_lo, color='green', label='pre-SNEP')
ax1.scatter(lo_label, post_lo, color='red', label='post-SNEP')
plt.show()

运行代码时出现错误:could not convert string to float: 'lo'。单独运行第一组散点图,或单独运行后两组散点图均能正常执行。请问出错原因是什么?是否可以在同一图中绘制带字符串X轴的三个散点图?

为啥会报错?

你第一次画c_labels的散点时,Matplotlib会自动把这些字符串标签转换成数字索引(比如第一个标签ll120对应0,第二个ll123对应1,以此类推),把X轴当成数值轴来处理。

等你后面再画lo标签的散点时,Matplotlib默认认为X轴还是数值类型,会尝试把字符串'lo'转成浮点数——这显然做不到,于是就抛出了那个错误。

当然可以在同一图里画!怎么改?

核心思路就是咱们手动控制每个标签在X轴的位置,不让Matplotlib自动转换。具体步骤如下:

  1. 把所有要显示的X轴标签整合到一起,给每个标签分配唯一的数字位置
  2. 用这些数字位置绘制散点,最后再把X轴的数字替换成咱们的字符串标签

修改后的代码如下:

import matplotlib.pyplot as plt

# 原始数据
c_pop = [0.410, -0.094, -0.111, -0.106, -0.090, 0.070, -0.043, -0.181, 0.221]
c_labels = ['ll120', 'll123', 'll124', 'll27', 'll28', 'll30', 'll446, n12', 'll447, n86', 'll471']
pre_lo = [-0.493]
post_lo = [0.145]
lo_label = ['lo']

# 合并所有标签,生成标签与X轴位置的映射
all_labels = c_labels + lo_label
x_pos_map = {label: idx for idx, label in enumerate(all_labels)}

fig = plt.figure()
ax1 = fig.add_subplot(111)

# 根据位置绘制三组散点
ax1.scatter([x_pos_map[label] for label in c_labels], c_pop, color='black')
ax1.scatter(x_pos_map['lo'], pre_lo, color='green', label='pre-SNEP')
ax1.scatter(x_pos_map['lo'], post_lo, color='red', label='post-SNEP')

# 设置X轴显示的标签,旋转45度避免重叠
ax1.set_xticks(list(x_pos_map.values()))
ax1.set_xticklabels(list(x_pos_map.keys()), rotation=45, ha='right')

# 添加图例并调整布局
plt.legend()
plt.tight_layout()
plt.show()

补充小技巧

  • 如果你想让'lo'标签出现在特定位置(比如不是最后),只需要调整all_labels的顺序即可
  • rotation=45和ha='right'是为了避免长标签互相遮挡,提升图表可读性

内容的提问来源于stack exchange,提问作者Marnix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:57:14