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自动转换。具体步骤如下:
- 把所有要显示的X轴标签整合到一起,给每个标签分配唯一的数字位置
- 用这些数字位置绘制散点,最后再把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
相关产品推荐
相关产品推荐

