Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对数据框中的数据使用Matplotlib(线图)时,沿x轴缺少文本标签_Python_Matplotlib - Fatal编程技术网

Python 对数据框中的数据使用Matplotlib(线图)时,沿x轴缺少文本标签

Python 对数据框中的数据使用Matplotlib(线图)时,沿x轴缺少文本标签,python,matplotlib,Python,Matplotlib,我试图从Pandas数据框中绘制数据,该数据框是通过从CSV导入数据创建的。但是,在绘图中,并非每个标签都沿x轴显示,绘图仅沿x轴显示5个标签 我总共有22个基于文本的标签,它们都应该沿着x轴显示为记号/标签。这些标签对应于dataframe中名为Category的列中的条目 对于dataframe的Line列中的每一行,将在绘图中创建一条单独的行。数据框中的Amount列包含y值 我相信这有一个简单的调整,尝试ax.set\u xticksnp.arangelen21和 plt.xticks

我试图从Pandas数据框中绘制数据,该数据框是通过从CSV导入数据创建的。但是,在绘图中,并非每个标签都沿x轴显示,绘图仅沿x轴显示5个标签

我总共有22个基于文本的标签,它们都应该沿着x轴显示为记号/标签。这些标签对应于dataframe中名为Category的列中的条目

对于dataframe的Line列中的每一行,将在绘图中创建一条单独的行。数据框中的Amount列包含y值

我相信这有一个简单的调整,尝试ax.set\u xticksnp.arangelen21和 plt.xticks arange21不起作用,可能是因为标签是基于文本的,而不是数字

编辑2

在用另一个软件设置更改计算机后,我在初始代码方面遇到了一些问题。现在我得到了另一个版本的代码和CSV,我可以毫无问题地运行它,它实际上可以绘制一个图形。现在回到最初的问题,从附图中可以看出,只有少数类别gts、jma、yja、lre、fgg沿x轴显示为标签,我希望所有22个类别沿x轴显示全文:

以下是我用于打印的代码,它不显示所有x标签:

import pandas as pd
import matplotlib.pyplot as plt

df=pd.read_csv("import.csv", 
                   names=["Category", "Line", "Amount"], encoding="iso-8859-1")

fig, ax = plt.subplots(1,1);
df.groupby("Category").plot(x="Line", y="Amount", ax=ax)

plt.legend([v[0] for v in df.groupby('Category')['Category']], bbox_to_anchor=(1.1, 0.5)) 
plt.xlabel('Category')
plt.ylabel('Amount')

for line in ax.lines:
    line.set_linewidth(0.5)
CSV内容如下所示,我没有发布整个文件,因为有很多行。我相信这应该足够重现这个问题,当然,如果没有这个情节,我可以放更多。第一列为行列,第二列为类别列,第三列为金额列:

jabber,gts,1
jabber,aed,6
jabber,ame,2
jabber,asy,8
jabber,fxk,1
jabber,jma,6
jabber,oaw,2
jabber,ejt,8
jabber,qat,1
jabber,dzj,6
jabber,yja,2
jabber,ajz,8
jabber,jbp,1
jabber,bvi,6
jabber,pec,2
jabber,lre,8
jabber,wlx,1
jabber,hpw,6
jabber,spg,2
jabber,bdg,8
jabber,fgg,1
jabber,fgz,5
soshy,gts,6
soshy,aed,2
soshy,ame,8
soshy,asy,1
soshy,fxk,6
soshy,jma,2
soshy,oaw,8
soshy,ejt,1
soshy,qat,6
soshy,dzj,2
soshy,yja,8
soshy,ajz,1
soshy,jbp,6
soshy,bvi,2
soshy,pec,8
soshy,lre,1
soshy,wlx,6
soshy,hpw,2
soshy,spg,8
soshy,bdg,1
soshy,fgg,6
soshy,fgz,2

您正在寻找xticks, Matplotlib自动选择将显示的XTick,以保持简单和美观。在处理时间序列或数字x轴时,此功能非常有效。但你的情况不太好

您需要做的是找出绘图开始和结束处的坐标,并使用这些数字手动定位x记号。您可以通过调用plt.xticks获取此信息。这会给你一个完整的cordinates数组,xtick标签

>>> plt.xticks()
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
         17, 18, 19, 20, 21]), <a list of 22 Text xticklabel objects>)

是的,可能。如果您需要帮助,请查看并更新您的问题。由于数据中只有YearA,因此它将只生成一个标签,这是预期的。也许我的评论不够清晰,在这种情况下,请看。我又添加了一年的CSV数据。我认为一年就足以重现这个问题,同时也满足了一个最小的例子。对于每一年,在绘图窗口中创建一条新的直线/图形。年份不是x标签。x标签由中间的“类别”列给出,在CSV数据中,每个类别至少有一行。现在还不清楚你到底在问什么,看看结果。我还不能到处发表评论,否则我会对你的问题发表评论。我现在只有Python3.6可以使用,不知道你在用什么。这太棒了,非常感谢!在我的一侧/设置中,我必须将plt.xticksrange0,x_max,tick_标签,旋转=45更改为plt.xticksrange0,x_max+1,tick_标签,旋转=45,以获得绘图右侧的最后一个x标签。在我看来,你对你的codeNo道具中的每一步都做了很好的评论/记录,很高兴它对你有用,是的,忘记了+1,我会编辑它。
import pandas as pd
import matplotlib.pyplot as plt
plt.ion() # turn on interactive plotting for ipython
# I stuck your data in a list
data = [
    ['jabber', 'gts', 1], ['jabber', 'aed', 6], ['jabber', 'ame', 2], ['jabber', 'asy', 8],
    ['jabber', 'fxk', 1], ['jabber', 'jma', 6], ['jabber', 'oaw', 2], ['jabber', 'ejt', 8],
    ['jabber', 'qat', 1], ['jabber', 'dzj', 6], ['jabber', 'yja', 2], ['jabber', 'ajz', 8],
    ['jabber', 'jbp', 1], ['jabber', 'bvi', 6], ['jabber', 'pec', 2], ['jabber', 'lre', 8],
    ['jabber', 'wlx', 1], ['jabber', 'hpw', 6], ['jabber', 'spg', 2], ['jabber', 'bdg', 8],
    ['jabber', 'fgg', 1], ['jabber', 'fgz', 5], ['soshy', 'gts', 6], ['soshy', 'aed', 2],
    ['soshy', 'ame', 8], ['soshy', 'asy', 1], ['soshy', 'fxk', 6], ['soshy', 'jma', 2],
    ['soshy', 'oaw', 8], ['soshy', 'ejt', 1], ['soshy', 'qat', 6], ['soshy', 'dzj', 2],
    ['soshy', 'yja', 8], ['soshy', 'ajz', 1], ['soshy', 'jbp', 6], ['soshy', 'bvi', 2],
    ['soshy', 'pec', 8], ['soshy', 'lre', 1], ['soshy', 'wlx', 6], ['soshy', 'hpw', 2],
    ['soshy', 'spg', 8], ['soshy', 'bdg', 1], ['soshy', 'fgg', 6], ['soshy', 'fgz', 2]]

df = pd.DataFrame(data, columns=["Category", "Line", "Amount"])
fig, ax = plt.subplots(1, 1)
df.groupby("Category").plot(x="Line", y="Amount", ax=ax)
plt.legend([v[0] for v in df.groupby('Category')['Category']], bbox_to_anchor=(1.1, 0.5))

# get the values we want displayed as tick labels
tick_labels = tuple(df['Line'])
# get the positions for the maximum xtick label
x_max = int(max(plt.xticks()[0]))  # int() to convert numpy.int32 => int
# manually set you xtick labels
plt.xticks(range(0, x_max + 1), tick_labels, rotation=45) 

plt.xlabel('Category')
plt.ylabel('Amount')
# change the limits and padding of the figure
plt.figure(1).subplots_adjust(
    **dict(left=0.1, right=.8, bottom=.15, top=.9, wspace=.1, hspace=.1))
for line in ax.lines:
    line.set_linewidth(0.5)

plt.plot()    # might need this without ipython