Python 3.x 是否停止x轴标签在Matplotlib中收缩绘图?
我正在尝试用以下代码制作条形图:Python 3.x 是否停止x轴标签在Matplotlib中收缩绘图?,python-3.x,matplotlib,pycharm,seaborn,Python 3.x,Matplotlib,Pycharm,Seaborn,我正在尝试用以下代码制作条形图: import pandas as pd import matplotlib.pyplot as plt import seaborn as sns test = {'names':['a','b','abcdefghijklmnopqrstuvwxyz123456789012345678901234567890'], 'values':[1,2,3]} df = pd.DataFrame(test) plt.rcParams['figure.autolayo
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
test = {'names':['a','b','abcdefghijklmnopqrstuvwxyz123456789012345678901234567890'], 'values':[1,2,3]}
df = pd.DataFrame(test)
plt.rcParams['figure.autolayout'] = False
ax = sns.barplot(x='names', y='values', data=df)
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
plt.show()
但是我得到了以下错误,因为“names”中的长值作为x轴上的标签使图像收缩,直到底部高于顶部
Traceback (most recent call last):
File "C:/Users/Adam/.PyCharm2018.2/config/scratches/scratch.py", line 11, in <module>
plt.show()
File "C:\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 253, in show
return _show(*args, **kw)
File "C:\Program Files\JetBrains\PyCharm 2018.2.3\helpers\pycharm_matplotlib_backend\backend_interagg.py", line 25, in __call__
manager.show(**kwargs)
File "C:\Program Files\JetBrains\PyCharm 2018.2.3\helpers\pycharm_matplotlib_backend\backend_interagg.py", line 107, in show
self.canvas.show()
File "C:\Program Files\JetBrains\PyCharm 2018.2.3\helpers\pycharm_matplotlib_backend\backend_interagg.py", line 62, in show
self.figure.tight_layout()
File "C:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 2276, in tight_layout
self.subplots_adjust(**kwargs)
File "C:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 2088, in subplots_adjust
self.subplotpars.update(*args, **kwargs)
File "C:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 245, in update
raise ValueError('bottom cannot be >= top')
ValueError: bottom cannot be >= top
回溯(最近一次呼叫最后一次):
文件“C:/Users/Adam/.PyCharm2018.2/config/scratch/scratch.py”,第11行,在
plt.show()
文件“C:\Anaconda3\lib\site packages\matplotlib\pyplot.py”,第253行,在show中
返回显示(*参数,**千瓦)
文件“C:\Program Files\JetBrains\PyCharm 2018.2.3\helpers\PyCharm\u matplotlib\u backend\backend\u interagg.py”,第25行,在调用中__
经理展示(**kwargs)
文件“C:\Program Files\JetBrains\PyCharm 2018.2.3\helpers\PyCharm\u matplotlib\u backend\backend\u interagg.py”,第107行,显示
self.canvas.show()
文件“C:\Program Files\JetBrains\PyCharm 2018.2.3\helpers\PyCharm\u matplotlib\u backend\backend\u interagg.py”,第62行,显示
self.figure.tight_布局()
文件“C:\Anaconda3\lib\site packages\matplotlib\figure.py”,第2276行,紧凑布局
自我调整子批次(**kwargs)
文件“C:\Anaconda3\lib\site packages\matplotlib\figure.py”,第2088行,在子地块中
self.subplotpars.update(*args,**kwargs)
更新中第245行的文件“C:\Anaconda3\lib\site packages\matplotlib\figure.py”
raise VALUERROR('底部不能>=顶部')
ValueError:底部不能>=顶部
下面是如果我稍微缩短该名称的长度时的情况:
如何使图形扩展以适合标签,而不是收缩轴?一种解决方法是将
轴
实例自己创建为轴,而不是子地块。然后tight\u layout()
没有效果,即使它是在内部调用的。然后可以将带有ax
关键字的轴传递到sns.barplot
。现在的问题是,如果调用plt.show()
标签可能会被切断,但如果使用bbox\u inches='tight'
调用savefig
,则图形大小将扩展为包含图形和所有标签:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
test = {'names':['a','b','abcdefghijklmnopqrstuvwxyz123456789012345678901234567890'], 'values':[1,2,3]}
df = pd.DataFrame(test)
#plt.rcParams['figure.autolayout'] = False
ax = sns.barplot(x='names', y='values', data=df, ax=ax)
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
#plt.show()
fig.savefig('long_label.png', bbox_inches='tight')
宣告者:我没有pycharm
,因此在这段代码中有一个假设,matplotlib
在使用和不使用pycharm
时表现相同。无论如何,对我来说,结果是这样的:
一种解决方法是将轴
实例自己创建为轴,而不是子地块。然后tight\u layout()
没有效果,即使它是在内部调用的。然后可以将带有ax
关键字的轴传递到sns.barplot
。现在的问题是,如果调用plt.show()
标签可能会被切断,但如果使用bbox\u inches='tight'
调用savefig
,则图形大小将扩展为包含图形和所有标签:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
test = {'names':['a','b','abcdefghijklmnopqrstuvwxyz123456789012345678901234567890'], 'values':[1,2,3]}
df = pd.DataFrame(test)
#plt.rcParams['figure.autolayout'] = False
ax = sns.barplot(x='names', y='values', data=df, ax=ax)
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
#plt.show()
fig.savefig('long_label.png', bbox_inches='tight')
宣告者:我没有pycharm
,因此在这段代码中有一个假设,matplotlib
在使用和不使用pycharm
时表现相同。无论如何,对我来说,结果是这样的:
如果您希望在交互式后端中使用此功能,除了手动调整体形大小外,我没有找到其他方法。这是我使用qt5agg
后端得到的结果:
ax = sns.barplot(x='names', y='values', data=df)
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
ax.figure.set_size_inches(5, 8) # manually adjust figure size
plt.tight_layout() # automatically adjust elements inside the figure
plt.show()
请注意,pycharm的科学模式可能会产生一些魔法,阻止它工作,因此您可能需要停用它或只是在pycharm外部运行脚本。如果您希望在交互式后端中运行此脚本,除了手动调整图形大小,我没有找到任何其他方法。这是我使用qt5agg
后端得到的结果:
ax = sns.barplot(x='names', y='values', data=df)
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
ax.figure.set_size_inches(5, 8) # manually adjust figure size
plt.tight_layout() # automatically adjust elements inside the figure
plt.show()
请注意,pycharm的科学模式可能会使用一些魔法来阻止它工作,因此您可能需要停用它,或者只是在pycharm之外运行脚本。可能这个答案是同一行,可能会帮助您。。。是PyCharm内部后端调用了紧密布局
。。。对此不予评论,除了。。。也许不要使用pycharm。也许这个答案是同一句话,可能会帮助你。。。是PyCharm内部后端调用了紧密布局
。。。对此不予评论,除了。。。也许不要使用pycharm。很好的解决方法!当xlabel
超过一定长度时,我在子地块网格中获取imshow()
以使图像占据较大图形的全宽时遇到了问题。这把它修好了。谢谢。很好的解决方法!当xlabel
超过一定长度时,我在子地块网格中获取imshow()
以使图像占据较大图形的全宽时遇到了问题。这把它修好了。非常感谢。