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?
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.
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
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.