4

我必须使用 Matplotlib 库来可视化 XAxis 上带有中文刻度标签的一些数据。这是一个例子:

带有中文刻度标签的图

我想更改刻度标签的文本方向以获得如下图:

在此处输入图像描述

请注意,这不是“文本旋转”。这是关于文本方向的。

如何在 Matplotlib 中实现这一点?

PS 以上图表是在 Excel 中创建的,用于演示。这是 Matplotlib 的代码,它可以像第一个一样生成绘图。好吧,我无法在 Matplotlib 中生成第二个,这就是我在这里的原因......

import matplotlib.pyplot as plt
import matplotlib.font_manager as mfont
myfont = mfont.FontProperties('SimHei')

data = [1,2,3,4,5]
labels = ['中文1', '中文2', '中文3', '中文4', '中文5']

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(data, data, tick_label=labels)

for label in ax.xaxis.get_majorticklabels():
    label.set(fontproperties=myfont)
plt.show()

我在标签文本中插入了新行,得到了如下图: 在此处输入图像描述

有东西遮挡了文本。

上图的代码:

import matplotlib.pyplot as plt
import matplotlib.font_manager as mfont
# myfont = mfont.FontProperties('SimHei', size=30)

data = [1,2,3,4,5]
labels = ['中\n文\n1', '中\n文\n2 ', '中\n文\n3', '中\n文\n4', '中\n文\n5']

fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot(111)
ax.bar(data, data, tick_label=labels)

for label in ax.xaxis.get_majorticklabels():
    label.set(family='SimHei', size=15, backgroundcolor='red', linespacing=3)
plt.show()
4

3 回答 3

3

访问:

https://matplotlib.org/gallery/ticks_and_spines/ticklabels_rotation.html

例子:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [1, 4, 9, 6]
labels = ['Frogs', 'Hogs', 'Bogs', 'Slogs']

plt.plot(x, y, 'ro')

您可以以度数或使用关键字指定刻度标签的旋转。

plt.xticks(x, labels, rotation='vertical')

填充边距,以便标记不会被轴夹住

plt.margins(0.2)

调整间距以防止刻度标签被剪裁

plt.subplots_adjust(bottom=0.15)
plt.show()
于 2019-04-07T19:48:39.460 回答
2

我认为没有任何选项可以在 matplotlib 中垂直打印文本。但是,您可以通过在要打印的文本中插入换行符来进行简单的破解。

import matplotlib.pyplot as plt
import matplotlib.font_manager as mfont
myfont = mfont.FontProperties('SimHei')

data = [1,2,3,4,5]
labels = ['中\n文\n1', '中\n文\n2', '中\n文\n3', '中\n文\n4', '中\n文\n5']

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(data, data, tick_label=labels)

for label in ax.xaxis.get_majorticklabels():
    label.set(fontproperties=myfont)
plt.show()
于 2018-12-27T09:42:46.307 回答
1

打印刻度时将每个单词换行的解决方法。

labels = ['\n'.join(list(tick)) for tick in labels ]
于 2018-12-27T09:37:58.077 回答