虽然使用matplotlib
可以画出各种组合图形,但是使用pandas
自带matplotlib
API能更简单高效的绘制出好看的图形。
简单图形绘制
使用pandas
自带的api绘制图形非常方便。
导入数据:
In [4]: import pandas as pd
In [5]: import numpy as np
In [6]: import matplotlib.pyplot as plt
In [7]: df = pd.read_excel('01_test_group_stat.xlsx',header=0)
In [8]: df.head()
Out[8]:
NUM 90dB_std 90dB_mean 90dB_interval 85dB_std 85dB_mean 85dB_interval 80dB_std 80dB_mean ... 15dB_std 15dB_mean 15dB_interval 10dB_std 10dB_mean 10dB_interval 0dB_std 0dB_mean 0dB_interval
0 101 25.444129 -10.295017 135.04 15.075547 4.539758 56.08 27.982940 -36.032642 ... 30.737979 -11.378675 167.09 8.186763 -9.021683 43.87 7.201149 -1.024150 27.46
1 102 7.111787 17.771917 33.57 7.704128 19.269800 35.48 10.148673 15.964733 ... 9.069287 34.272467 39.67 9.329397 -14.305033 41.96 13.663520 -9.728942 52.26
2 103 4.667749 1.017975 27.08 28.544152 20.333050 135.81 3.415473 25.697400 ... 4.400247 4.619142 26.32 34.558291 0.940050 170.13 10.685239 5.533150 51.11
3 104 14.674394 -2.259317 49.97 13.053583 26.952875 53.40 25.713856 11.828242 ... 26.840332 -32.337458 150.30 8.092768 -20.856675 44.25 4.520228 39.771008 40.05
4 105 4.015146 9.256283 22.51 13.710575 0.719875 54.93 9.083101 32.437342 ... 9.681165 -19.592317 40.44 9.873788 27.430317 42.72 10.993832 33.901133 48.83
[5 rows x 58 columns]
画一些简单的图:
# 密度图
In [10]: df.iloc[:,1].plot(kind='density',legend=True,title='hello world!')
Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0x1dad1a5ed68>
In [11]: plt.xlabel('hello hello')
Out[11]: Text(0.5,0,'hello hello')
In [12]: plt.show()
image.png
#柱状图
In [13]: df.iloc[:,1].plot(kind='hist',legend=True,title='hello world!')
Out[13]: <matplotlib.axes._subplots.AxesSubplot at 0x1dad213d208>
In [14]: plt.show()
image.png
#散点图
In [17]: df.plot(kind='scatter',x='90dB_std',y='90dB_mean',legend=True,title='hello world!')
Out[17]: <matplotlib.axes._subplots.AxesSubplot at 0x1dad49d7208>
In [18]: plt.show()
绘制稍微复杂一些的组合图形
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('ggplot')
font = {'family': 'serif',
'color': 'darkred',
'weight': 'normal',
'size': 16,
}
df_1 = pd.read_csv('./01/tmp/01_90dB_mean_norm_w10_s5.csv', header=0)
df_2 = pd.read_csv('./01/01_stimulate_mean_normed.csv', header=0)
# 当组合图只有一行或者一列时,默认会将axes压成一维的,squeeze参数可取消压缩维度
fig, axes = plt.subplots(ncols=1, nrows=1, figsize=(15, 10), squeeze=False)
for col in list(df_1.columns):
# label参数表示图例名称
axes[0, 0].plot(df_1[col], label=col)
axes[0, 0].plot(df_2['90dB_mean'], label='90dB_mean')
# 绘制整个fig的图例,而非某个subplot的图例
handles, labels = axes[0, 0].get_legend_handles_labels()
fig.legend(handles, labels)
plt.show()
将x轴的数字序列改为字符串标签
import matplotlib.pyplot as plt
plt.style.use('ggplot')
font = {'family': 'serif', 'color': 'black', 'weight': 'normal', 'size': 14}
axes = plt.figure().add_subplot(111)
plt.bar(x=[1,2,3], height=[4,5,6])
plt.xticks([1,2,3])
x_labels=axes.get_xticks().tolist()
x_labels[0]='gogogo'
axes.set_xticklabels(x_labels,fontdict=font)
plt.show()
fig, axes = plt.subplots(1,2,squeeze=False)
axes[0,0].bar(x=[1,2,3],height=[4,5,6])
axes[0,1].bar(x=[4,5,6],height=[7,8,9])
ax0 = axes[0,0].get_xticks().tolist()
ax1 = axes[0,1].get_xticks().tolist()
ax0[2] = 'hello'
ax1[2] = 'world'
axes[0,0].set_xticklabels(ax0,fontdict=font)
axes[0,1].set_xticklabels(ax1,fontdict=font)
plt.show()