思路:先生成图片,再添加画布,随后画图,最后逐步添加属性设置
基本设置
plt.rcParams['font.size']= 5.5
plt.rcParams['font.family']='Arial'
初始化图片和画布
fig = plt.figure(figsize=(4,2),dpi=300)
ax1 = fig.add_subplot(111)
画图(推荐使用DataFrame.plot函数)
emisGroup.plot(kind='barh', ax=ax1, stacked=True, cmap=cMap([B[1], B[4]]),ec='black',lw=0.3,legend=False,ylabel=False,zorder=3)
这里zorder指定画图顺序。设大一点是让后面的网格线在条形图后面
接下来的设置就是对画布进行一系列设置,返回的对象也都是matplotlib.xx对象
画布位置设置
from matplotlib.transforms import Bbox
ax1.set_position(Bbox([[0.125, 0.2], [0.9, 0.9]]))
plt.tight_layout()
Bbox语法: Bbox[[xmin, ymin], [xmax, ymax]]
plt.tight_layout()推荐,比较方便
颜色设置
matplotlib.colors是一个类。里面有关于颜色的各种自定义方法
from matplotlib.colors import ListedColormap,LinearSegmentedColormap
B = ['#2E4F68', '#A5C7DD'] # 各种blue
def cMap(c):
return LinearSegmentedColormap.from_list('c', c, 265)
cmap = cMap(B[0],B[1])
生成了从浅到深的颜色系列,做条形图、环形图等的时候,指定cm参数为设置的cmap,会从里面挑颜色,而不是使用默认颜色。
坐标轴设置
粗细,是否可见
ax1.spines['bottom'].set_linewidth(0.5)
ax1.spines['top'].set_linewidth(0.5)
ax1.spines['right'].set_linewidth(0.5)
ax1.spines['left'].set_linewidth(0.5)
ax1.spines['left'].set_visible(0.5)
范围
ax1.set_xlim(0,450)
轴标签
ax1.tick_params(length=2, width=0.5, grid_linewidth=2, grid_linestyle='--')
ax1.set_yticklabels(['Others','Huanghe','Zhujiang','Changjing'])
轴标题
ax1.set_xlabel()
图例设置
ax1.legend(['Ocean-going','Coastal','Domestic'],loc='lower left')
关于legend的loc和bbox_to_anchor的设置
bbox是bound box,简单理解就是图例外面的一圈边。loc和bbox_to_anchor都是为了给legend定位。loc指定了定位点在哪里,bbox_to_anchor传入长度为2的元组(元素范围:0-1),指定定位点在图片中的位置。传入长度为4的元组,指定定位点在图片中的位置以及bbox的长宽。
当然其他的东西也可以设置bbox。具体设置方法可以是利用xx = ax1.get_xx(),先获取元素,然后xx.set_yy(arg)。比如
legend = ax1.get_legend()
legend.set_alpha(0.5) # 设置透明度
label = ax1.get_yticklabels()+ax1.get_yticklabels()
for i in label:
i.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.8, zorder=2))
可以用get获取元素,然后set设置元素属性。当传入参数为多个时,弄成字典。
网格线设置
ax1.grid(axis='x',linestyle='--', lw=0.5, color='lightgrey', zorder=0)
对画布进行设置的函数,都长成set_的样子。还有对整个元素进行设计的,就是_params的样子
有一些方法和属性从matplotlib官方文档里找不到,却能从百度到。。也能生效。还是需要多积累一些的