我试图在一个图中制作三个散点图。我试过这种方式。
先进行导入。
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()
我得到的错误是:无法将字符串转换为float:lo
似乎它试图将lo_label转换为其他东西。
如果我禁用第一个散点图并且仅运行第二个和第三个,则代码会运行。当我只运行第一个散点图并禁用第二个散点图时它也会运行。
出了什么问题?是否可以在一个带有x轴标签的图中制作三个散点图?
答案 0 :(得分:2)
Matplotlib分类支持是matplotlib 2.1中的一个相当新的功能。还有一些问题仍在继续。
问题中的代码在matplotlib 2.1.1或更高版本中运行良好。
import matplotlib.pyplot as plt
import numpy as np
x1 = ["apple", "banana", "apple", "cherry"]
x2 = ["cherry", "date"]
y1 = [1,2,2,2]
y2 = [3,4]
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.scatter(x1, y1, color='black', label='Initial Fruits')
ax1.scatter(x2, y2, color='green', label='Further Fruits')
plt.legend()
plt.show()
虽然matplotlib 2.1.0原则上允许绘制类别,但是不可能将其他类别添加到现有的分类轴。因此,需要使用也适用于更低版本的解决方案,将值绘制为数值数据。
import matplotlib.pyplot as plt
import numpy as np
x1 = ["apple", "banana", "apple", "cherry"]
x2 = ["cherry", "date"]
y1 = [1,2,2,2]
y2 = [3,4]
c = ["black"]*len(x1) + ["green"]*len(x2)
u, inv = np.unique(x1+x2, return_inverse=True)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.scatter(inv, y1+y2, c=c, )
f = lambda c : plt.plot([],color=c, ls="", marker="o")[0]
ax1.legend(handles = [f("black"), f("green")],
labels=['Initial Fruits', 'Further Fruits'])
ax1.set_xticks(range(len(u)))
ax1.set_xticklabels(u)
plt.show()
两种情况下产生的情节: