Python matplotlib:字符串散点图

Python matplotlib:字符串散点图,python,matplotlib,Python,Matplotlib,我在文本文件中有此表单中的数据: strings year avg -- -- -- abc 2012 1854 abc 2013 2037 abc 2014 1781 pqr 2011 1346 pqr 2012 1667 xyz 2015 1952 我想在x轴上用(不同的)字符串绘制散点图,在y轴上用(不同的)年份绘制散点图,并且标记(圆)的大小应等于平均值。我在matplotlib中实现它时遇到

我在文本文件中有此表单中的数据:

strings  year  avg
--       --    --
abc      2012  1854
abc      2013  2037
abc      2014  1781
pqr      2011  1346
pqr      2012  1667
xyz      2015  1952
我想在x轴上用(不同的)字符串绘制散点图,在y轴上用(不同的)年份绘制散点图,并且标记(圆)的大小应等于平均值。我在matplotlib中实现它时遇到困难,因为散点函数需要x,y(数据位置)的数值。因此,我无法将字符串指定为x,将年份指定为y。是否需要进一步预处理此数据?

使用matplotlib>=2.1绘制分类变量散布图 在matplotlib 2.1中,您可以只向散布函数提供字符串

strings = ["abc","abc","abc","pqr","pqr","xyz"]
year = list(range(2012,2018))
avg = [1854, 2037,1781,1346,1667,1952]

import matplotlib.pyplot as plt
import numpy as np

plt.scatter(strings, year, s=avg)

plt.show()
使用matplotlib<2.1绘制分类变量散布 在2.1以下的matplotlib中,需要根据与类别对应的某些索引绘制数据。然后相应地设置标签

strings = ["abc","abc","abc","pqr","pqr","xyz"]
year = list(range(2012,2018))
avg = [1854, 2037,1781,1346,1667,1952]

import matplotlib.pyplot as plt
import numpy as np

u, ind = np.unique(strings, return_inverse=True)
plt.scatter(ind, year, s=avg)
plt.xticks(range(len(u)), u)

plt.show()
两种情况下的输出

使用matplotlib>=2.1绘制分类变量分散 在matplotlib 2.1中,您可以只向散布函数提供字符串

strings = ["abc","abc","abc","pqr","pqr","xyz"]
year = list(range(2012,2018))
avg = [1854, 2037,1781,1346,1667,1952]

import matplotlib.pyplot as plt
import numpy as np

plt.scatter(strings, year, s=avg)

plt.show()
使用matplotlib<2.1绘制分类变量散布 在2.1以下的matplotlib中,需要根据与类别对应的某些索引绘制数据。然后相应地设置标签

strings = ["abc","abc","abc","pqr","pqr","xyz"]
year = list(range(2012,2018))
avg = [1854, 2037,1781,1346,1667,1952]

import matplotlib.pyplot as plt
import numpy as np

u, ind = np.unique(strings, return_inverse=True)
plt.scatter(ind, year, s=avg)
plt.xticks(range(len(u)), u)

plt.show()
两种情况下的输出


即使是我也想要同样的方法,并找到了更简单的方法。您可以使用Seaborn,这是一个基于Matplotlib的库

您可以在任一轴上给出文本,在另一轴上给出时间/年。要获得最大的可视化效果,可以设置两个轴的限制。让我们将“df”作为数据帧的名称

import seaborn as sns

minYear = df['year'].min()
maxYear = df['year'].max()
pl = sns.catplot(x = strings,y = year, data = df)
pl.set(ylim=(minYear,maxYear))

这将为您提供尽可能好的可视化效果。

即使我也想要同样的效果,并找到了更简单的方法。您可以使用Seaborn,这是一个基于Matplotlib的库

您可以在任一轴上给出文本,在另一轴上给出时间/年。要获得最大的可视化效果,可以设置两个轴的限制。让我们将“df”作为数据帧的名称

import seaborn as sns

minYear = df['year'].min()
maxYear = df['year'].max()
pl = sns.catplot(x = strings,y = year, data = df)
pl.set(ylim=(minYear,maxYear))

这将为您提供最佳的可视化效果。

您有什么版本的matplotlib?@DavidG它是2.0.2Matplotlib 2.1,支持分类数据打印。因此,如果升级您的版本是一个选项,那么应该可以解决您的问题:您有什么版本的matplotlib?@DavidG it's 2.0.2Matplotlib 2.1支持分类数据打印。因此,如果升级您的版本是一个选项,那么这应该可以解决您的问题谢谢您的详细回答!)您的第一个被剪断的代码在matplotlib 2.1上不起作用。你能找出哪里出了问题吗?@SaadH代码在matplotlib 2.1上运行良好,这就是为什么我把它放在答案中。如果运行时遇到问题,可以首先检查matplotlib版本
导入matplotlib;打印(matplotlib.\uuuuuu version\uuuuuuuuu)
然后提供一个清晰的问题描述:输出是什么,是否存在错误等?好的,问题不在于版本,而是第二行:年=范围(20122018)将其更改为:年=[201220132014201120122015]解决问题以获得详细答案!:)您的第一个被剪断的代码在matplotlib 2.1上不起作用。你能找出哪里出了问题吗?@SaadH代码在matplotlib 2.1上运行良好,这就是为什么我把它放在答案中。如果运行时遇到问题,可以首先检查matplotlib版本
导入matplotlib;打印(matplotlib.\uuuuu version\uuuuuuu)
然后提供一个清晰的问题描述:输出是什么,是否存在错误等?好的,问题不在于版本,而是第二行:年=范围(20122018)将其更改为:年=[201220132014201120122015]解决了问题