How to display Chinese in pandas plot?

2019-02-24 12:35发布

问题:

Here, I have a plot work to do with pandas, like this :

most_active_posts.plot(x = 'title',y = 'active_span',kind = 'barh')

most_active_posts is an object of dataframe with index, I want a simple two-dimentional plot with two columns, one is 'title' and the other is 'active_span'.

title is type of string, which contains Chinese characters, while active_span is type of integer .

How can I display Chinese characters normally?

回答1:

My work-around is like this:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
font = fm.FontProperties(fname='c:\\windows\\fonts\\simsun.ttc')  # speicify font
ax = most_active_posts.plot(x = 'title',y = 'active_span',kind = 'barh')
ax.set_xticklabels(most_active_posts['title'].str.decode('utf-8'), fontproperties=font)
plt.show()

Basically, you need to specify a valid font for Chinese characters.



回答2:

  1. Enter the directory Lib\site-packages\matplotlib\mpl-data, and edit the file matplotlibrc.
  2. Locate font.family and font.sans-serif then uncomment both of them and inset Microsoft YaHei after font.sans-serif.


回答3:

I find a python library designed for fixing Chinese display in pip. You can download it using the command in your terminal:

pip install pyplotz

And you can write the following code instead(full code):

from pyplotz.pyplotz import PyplotZ
pltz = PyplotZ()
pltz.enable_chinese()
most_active_posts.plot(x='title',y='active_span',kind='bar')
pltz.xticks(np.arange(len(df.cn)),df.cn,rotation=360)
pltz.legend()
pltz.show()

The result is like this

And it can help you handle matplotlib Chinese font for you! This is the github page:

https://github.com/201528015329004/pyplotz

And there are some handy examples:

https://github.com/201528015329004/pyplotz/blob/master/examples/quick_start.ipynb



回答4:

I think you want the characters to be the labels on the plot right?

I just grabbed some random characters:

In [40]: df
Out[40]: 
   0 title
0  0     뉵
1  1     뉑
2  2     늘
3  3     度

[4 rows x 2 columns]

I don't think there is a way to set y_ticklabels from df.plot(), but you can set them from the returned axes object:

In [47]: ax = df.plot(kind='barh')

In [48]: ax.set_yticklabels(df['title'].str.decode('utf-8'))
Out[48]: 
[<matplotlib.text.Text at 0x1152abfd0>,
 <matplotlib.text.Text at 0x1152a3910>,
 <matplotlib.text.Text at 0x111c5e790>,
 <matplotlib.text.Text at 0x111c5ef10>]

In [49]: plt.draw()

Here's the figure:

I'm not actually able to save the file and have the characters show up. Not sure why at the moment, but this may get you started.