当前位置: 首页 > 知识库问答 >
问题:

当字符串数据传递到matplotlib API时,绘制的是什么?

罗昕
2023-03-14
# first, some imports:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

假设我想用这些数据做一个散点图:

np.random.seed(42)
x=np.arange(0,50)
y=np.random.normal(loc=3000,scale=1,size=50)

通过剧情:

plt.scatter(x,y)

我得到的答案是:

好的,让我们先创建一个数据框:

df=pd.DataFrame.from_dict({'x':x,'y':y.astype(str)})

(我知道我将y存储为str——这是一个可复制的示例,我这样做是为了反映真实的用例。)

那么,如果我这样做了:

plt.scatter(df.x,df.y)

我得到:

我在第二个情节中看到了什么?我认为第二个绘图必须显示与y列相对的x列,该列被转换为float。情况显然并非如此。

共有3个答案

卜方伟
2023-03-14
  • 如果提取标签和位置,则更明显的是API将字符串绘制为标签,并且轴位置是基于存在多少(len)类别的0索引数字。
print(x_nums_loc)
print(y_nums_loc)
print(x_lets_loc)
print(y_lets_loc)
print(x_lets_labels)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]

[Text(0, 0, 'A'), Text(1, 0, 'B'), Text(2, 0, 'C'), Text(3, 0, 'D'), Text(4, 0, 'E'),
 Text(5, 0, 'F'), Text(6, 0, 'G'), Text(7, 0, 'H'), Text(8, 0, 'I'), Text(9, 0, 'J'),
 Text(10, 0, 'K'), Text(11, 0, 'L'), Text(12, 0, 'M'), Text(13, 0, 'N'), Text(14, 0, 'O'),
 Text(15, 0, 'P'), Text(16, 0, 'Q'), Text(17, 0, 'R'), Text(18, 0, 'S'), Text(19, 0, 'T'),
 Text(20, 0, 'U'), Text(21, 0, 'V'), Text(22, 0, 'W'), Text(23, 0, 'X'), Text(24, 0, 'Y'),
 Text(25, 0, 'Z')]
import numpy as np
import string
import pandas as pd
import matplotlib.pyplot as plt
import string

# sample data
np.random.seed(45)
x_numbers = np.arange(100, 126)
x_letters = list(string.ascii_uppercase)
y= np.random.normal(loc=3000, scale=1, size=26).round(2)
df = pd.DataFrame.from_dict({'x_num': x_numbers, 'x_let': x_letters, 'y': y}).astype(str)

# plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 3.5))
df.plot(kind='scatter', x='x_num', y='y', ax=ax1, title='X Numbers', rot=90)
df.plot(kind='scatter', x='x_let', y='y', ax=ax2, title='X Letters')

x_nums_loc = ax1.get_xticks()
y_nums_loc = ax1.get_yticks()

x_lets_loc = ax2.get_xticks()
y_lets_loc = ax2.get_yticks()

x_lets_labels = ax2.get_xticklabels()

fig.tight_layout()
plt.show()
盖嘉珍
2023-03-14

根据dm2的优秀答案,当您将y作为字符串传递时,y只是被视为任意字符串标签,并按照它们出现的顺序一个接一个地绘制。为了演示,这里有一个更简单的示例

from matplotlib import pyplot as plt
x = [1, 2, 3, 4]
y = [5, 25, 10, 1] # these are ints
plt.scatter(x, y)

到目前为止还不错。现在,不同的字符串y值。

y = list("abcd")
plt.scatter(x, y)

您可以看到它是如何将y标签一个接一个地放在轴上的。

最后

y = ["5", "25", "10", "1"]
plt.scatter(x, y)

将此结果与之前的结果进行比较,现在应该可以清楚地看到发生了什么。

江正德
2023-03-14

Matplotlib不会自动将str值转换为数值,因此您的y值被视为分类值。就Matplotlib而言,“1.0”与“0.9”之间的差异以及“1.0”与“100.0”之间的差异并没有什么不同。

因此,绘图上的y轴将与从分类值分配标签的范围(len(y))相同(因为所有分类值之间的差异相同)。

由于您的x是一个等于range(50)的范围,而现在您的y也是一个范围(也等于range(50)),因此它绘制x=y,其中y标签设置为相应的str值。

 类似资料:
  • 问题内容: 我在网上找到了这段代码,其中有一部分我不理解。对于doInBackground方法,传递的参数为。有人可以告诉我这是什么意思吗?那是什么 问题答案: doInBackground(String… params) // params represents a vararg. new AsyncHttpPost().execute(s1,s2,s3); // pass strings to

  • 问题内容: 我正在查询页面上,用户在其中选择一个代表不同类型的值,每个值由一个ID标识。问题是使用WHERE IN方法从数据库中选择这些ID。 这是我的SQL语句 它将适用于一个单一值,例如。46,但如果值放在方括号中则不是,例如。(46)或(‘46’),即IN的方式。 我使用的是Visual Studio,它会自动生成访问表适配器以获取值的方法,所以我认为我必须通过SQL来做到这一点。 我正在传

  • #substr($(sometext),1,3)-->['$(sometext)','1','3'] #substr(#trim(你好),1,3)--->['#trim(你好)‘,'1','3'] #substr(#replace(hello-world,hello,hi),1,3)-->['#replace(hello-world,hello,hi)','1','3'] 当我们有这样的嵌套函数时

  • 我有一个循环,其中我从返回的Excel工作表中获取的所有数据都是日期格式的。这是循环: 一切都还好。我还可以使用可索引表库使用该数据创建一个表。现在的问题是,我需要将从该工作表中提取的数据与今天的数据进行比较,并检查提取的数据与今天之间的天差。有办法做到这一点吗?我试图使用date_create($cell),但该函数不接受数组。我需要将数组的所有日期与今天进行比较。 编辑: 嗨,我正在尝试将2个

  • 问题内容: 我的jQuery代码如下 我的控制器方法如下 如果我单击 btnExec的 意思是,它用字符串值正确触发了控制器方法,但是字典值始终为 null .. 在我的场景中,“控制器方法的返回类型应该仅是字符串” 我该如何解决?提前致谢 !!! 问题答案: 像这样的Tyr: 然后:

  • 我想转换一个组织。阿帕奇。火花sql。数据框到组织。阿帕奇。火花rdd。RDD[(字符串,字符串)]在数据块中。有人能帮忙吗? 背景(也欢迎使用更好的解决方案):我有一个Kafka流,它(经过一些步骤)变成了2列数据帧。我想将其放入Redis缓存,第一列作为键,第二列作为值。 更具体地说,输入的类型是:。我尝试将以下内容放入Redis: 错误消息如下所示: 我已经尝试过一些想法(比如函数、rdd)