【python实战】matplotlib绘图(三)

今天主要讲一下get到的一些小技能,包括:

  1. 当坐标轴标签太长,出框的时候,自动调整子图——语句:plt.tight_layout()
  2. 自动调整text(文本标签)的位置,避免重叠——调包:adjustText(具体文档见adjustText文档
  3. 调用已有的颜色主题;Choosing Colormaps in Matplotlib
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import matplotlib.transforms as mtransforms
from matplotlib.ticker import FuncFormatter
from adjustText import adjust_text
from matplotlib import cm
#设置字体、图形样式
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
# 颜色转换
def RGB_to_Hex(tmp):
    rgb = tmp.split(',')#将RGB格式划分开来
    strs = '#'
    for i in rgb:
        num = int(i)#将str转int
        #将R、G、B分别转化为16进制拼接转换并大写
        strs += str(hex(num))[-2:].replace('x','0').upper()
    return strs

1.左右条形图(left_right_barh)

left_right_barh.png
def left_right_barh(fig,subplotid,ylabel,values1,values2,label1,label2,textformat,withlegend=1,category=0,filename=0):
    values1=[0-i for i in values1]
    # 倒序
    ylabel,values1,values2=ylabel[::-1],values1[::-1],values2[::-1]
    # 作图
    ax=fig.add_subplot(subplotid)
    barh1=ax.barh(ylabel,width=values1,label=label1)
    barh2=ax.barh(ylabel,width=values2,label=label2)
    # 去掉边框
    orientation=['top','bottom','right']
    for o in orientation:
        ax.spines[o].set_visible(False)
    # 去掉xticks
    ax.set_xticks(())
    # 图例
    if withlegend:
        ax.legend(ncol=2, bbox_to_anchor=(0.5, -0.1),edgecolor='w',
                      loc='lower center', fontsize='small')
    # y轴标题
    if category:
        ax.set_ylabel(category)
    # 添加barh的数据标签
    texts=[]
    for b in barh1:
        texts.append(ax.text(b.get_width()-0.04,b.get_y()+b.get_height()/3,
            format(-b.get_width(),textformat),va="center",ha='left'))
    for b in barh2:
        texts.append(ax.text(b.get_width(),b.get_y()+b.get_height()/3,
            format(b.get_width(),textformat),va="center",ha='right'))
    adjust_text(texts,only_move={'points':'x', 'text':'x', 'objects':'x'}) #避免y轴上的调整
    plt.tight_layout()#调整子图,避免标签出框,自动调整的语句,图则会自动调整标签大小
    if filename:
        plt.savefig(filename,dpi=600)
    return ax
def left_right_barh_ex():
    # 数据
    ylabel=["不识字或识字很少","小学","初中","普通高中","中等职业/技术/师范学校","高职/大专","本科","研究生","博士"]
    values1=[0.0477,0.2013,0.2751,0.128,0.0774,0.1219,0.1244,0.0172,0.007]
    values2=[0.0196,0.1405,0.2834,0.1577,0.0597,0.1275,0.1698,0.0299,0.0119]
    textformat='.2%'
    fig=plt.figure()
    left_right_barh(fig,111,ylabel=ylabel,values1=values1,values2=values2,
        label1='母亲',label2='父亲',filename="left_right_barh.png",textformat=textformat)
    plt.show()
left_right_barh_ex()
  1. 若不加plt.tight_layout()的效果如下,可以看到,纵坐标标签太长已经出去了。
left_right_barh(轴标签未调整).png
  1. 若不加adjust_text(texts,only_move={'points':'x', 'text':'x', 'objects':'x'})的效果如下,可以看到,数据标签挤在一起了。
left_right_barh(数据标签未调整).png

adjustText这个包在做散点图进行数据标签添加时,应该是最有用的,文档中的例子如下:

adjustText.png

2.简单柱状图(simple_bar)

simple_bar1.png
def simple_bar(xlabel,value,colorname,filename):
    # 系列颜色选取
    colorname=cm.get_cmap(name=colorname)
    color=colorname(value)
    fig=plt.figure()
    ax=fig.add_subplot()
    bar=ax.bar(xlabel,value,color=color)
    # 去掉边框
    orientation=['top','left','right']
    for o in orientation:
        ax.spines[o].set_visible(False)
    # 去掉xticks
    ax.set_yticks(())
    # 文本标签
    for b in bar:
        ax.text(b.get_x()+b.get_width()/2,b.get_height()+0.01,
            format(b.get_height(),'.2%'),va="center",ha='center')
    plt.savefig(filename,dpi=600)
    plt.show()
def simple_bar_ex1():
    xlabel=["5万元以下",    "5万-10万",   "11万-20万",  "21万-40万",  "41万以上"]
    value=[0.3417,  0.3095, 0.2272, 0.0858, 0.0359]
    simple_bar(xlabel,value,colorname='coolwarm',filename='simple_bar1.png')

这里用的colorname是”coolwarm”,改一下这个colorname为“Pastel1”,效果如下:

simple_bar11.png

现有的主题颜色有:

color1.png
color2.png
color3.png
color4.png
color5.png
color6.png
color7.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348