我正在编写条形图函数,并且遇到了另一个小问题。我的ytick标签太长,导致无法看到我的y轴标签。只有大幅减少ytick标签的大小时,我才能看到y标签。
def bar_plot(data, x, y, title):
sns.set_style('darkgrid')
data = data.sort_values(ascending=False, by=x)
data = data.head(n=10)
if (data[x]>1000000).any():
data[x] = data[x] / 1000000
ax = sns.barplot(data=data, x=x, y=y)
ax.set_title(title, size=35)
ax.set_xlabel(x + ' ($ Millions)', size=15)
ax.set_ylabel(y, size=15)
ax.set_yticklabels(data[y].head(n=10), wrap=True)
else:
ax = sns.barplot(data=data, x=x, y=y)
ax.set_xlabel(x, size=15)
ax.set_ylabel(y, size=15)
ax.set_title(title, size=35)
ax.set_yticklabels(data[y].head(n=10), wrap=True)
我尝试过ax.set_yticklabels(data[y].head(n=10), wrap=True)
来包装文字。虽然有效,但是它不能包装足够的文字。有没有办法告诉wrap=True
在x个字符后换行?我已经尝试使用Google搜索,但是找不到任何有效的方法。
修改
我正在使用的数据框的格式类似于
Client Name Col 1 Col 2 Col 3 Col 4 Col 5
Some name 51,235.00 nan 23,423.00 12,456.00 654.00
Some long company name 152.00 5,626.00 nan 82,389.00 5,234.00
Name 12,554.00 5,850.00 1,510.00 nan 12,455.00
Company 12,464.00 nan 752.00 1,243.00 1,256.00
Long Company Name 12,434.00 78,915.00 522.00 2,451.00 6,567.00
答案 0 :(得分:1)
正如@ImportanceOfBeingErnest所指出的,您可以使用textwrap
模块来执行此操作,特别有用的是textwrap.fill()
:
textwrap.fill(text[, width[, ...]])
将单个段落包装为文本,因此每一行最多为
width
个字符,并返回包含已包装段落的单个字符串。fill()
是
的简写
"\n".join(wrap(text, ...))
尽管您将需要在每个标签上分别调用
ax.set_yticklabels([textwrap.fill(data[y].head(n=10)[i], width) for i in range(10)])
下面是一个更完整的示例来显示用法:
import textwrap
import matplotlib.pyplot as plt
import pandas as pd
df = {'Client Name': ['Some Name', 'Some long company name', 'Name',
'Company', 'Long Comany Name'],
'Col 1': [51235, 152, 12554, 12464, 12434]}
data = pd.DataFrame(df)
fig, ax = plt.subplots(1)
ax.set_yticklabels(data['Client Name'].head())
plt.show()
这将显示以下内容
而
ax.set_yticklabels([textwrap.fill(e, 7) for e in data['Client Name'].head()])
plt.show()
将显示更类似的内容
答案 1 :(得分:0)
textwrap
看起来很容易使用,但它以预定的字符数分割句子。这是一个每 \n
个单词插入一个换行符 (n
) 的函数。然后您可以使用 out
作为标签 x-(或 y-)轴刻度线。避免任何不必要的包依赖也可能是明智的。
Lst = ['You can never understand one language until you understand at least two.',
'Language is the blood of the soul into which thoughts run and out of which they grow.']
InsertNewlines = lambda lst, n=2: '\n'.join([' '.join(lst[i:i + n]) for i in range(0, len(lst), n)]) # n=words to keep together
out = [InsertNewlines(s.split()) for s in Lst]
输出:
['You can\nnever understand\none language\nuntil you\nunderstand at\nleast two.',
'Language is\nthe blood\nof the\nsoul into\nwhich thoughts\nrun and\nout of\nwhich they\ngrow.']