【python实战】matplotlib绘图(二)

【python实战】matplotlib绘图(一)

话不多说,接着画图,不得不说,matplotlib画图,写的代码是真多,

等画完了一段时间后,再来总结一下!

今天展示3张图片:

1.环形图+条形图(pie_barh)

pie_barh.png
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch
import numpy as np
#设置字体、图形样式
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
# 饼图/环形图
fig=plt.figure()
ax1=fig.add_subplot(121)
ax2=fig.add_axes([0.55, 0.33, 0.35, 0.35])#left, bottom, width, height
# 数据
data={
        "data": [
            {"question": "独生子女", "value": 0.5078},
            {"question": "非独生子女", "value":0.4922}
        ],
    }
ratios=[d["value"] for d in data['data']]
labels=[d["question"] for d in data['data']]
color=[RGB_to_Hex('41,130,177'),RGB_to_Hex('205,205,205')]

# 环形宽度
size=0.3
ax1.pie(ratios,startangle=90,
    # labeldistance=0.4,#文本标签
    colors=color,
    # autopct='\n\n\n%.2f%%',#百分比
    pctdistance=0.8,
    # labels=labels,
    wedgeprops= {'width': size, 'edgecolor': 'w'}
    )

# 加文本标签
bar_text=labels[0]+'\n'+format(ratios[0],'.2%')
ax1.text(0,0,bar_text,
    size=12,ha="center", va="center",
    bbox=dict(boxstyle="round",ec='white',fc='white'))

############################ 条形图
# 数据
data={
        "data": [
            {"question": "1个", "value": 0.6353},
            {"question": "2个", "value":0.2177},
            {"question": "3个及以上", "value":0.1470}
        ],
    }
# 数据设置
ratios=[d["value"] for d in data['data']]
labels=[d["question"] for d in data['data']]
#排序
data_sort=[list(z) for z in zip(labels, ratios)]
data_sort.sort(key=lambda x:(x[1]),reverse=False)
labels=[x[0] for x in data_sort]
ratios=[x[1] for x in data_sort]
# 作图
height=0.4
bar=ax2.barh(y=labels,width=ratios,height=height,color=RGB_to_Hex('205,205,205'))
# 去掉边框
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
ax2.spines['bottom'].set_visible(False)
#不要X横坐标上的label标签
plt.xticks(())
# 添加数据标签
for b in bar:
    width=b.get_width()
    plt.text(width+0.08,b.get_y()+height/2,format(width,'.2%'),ha='center')
# 取饼图和条形图的值
theta1, theta2 = ax1.patches[0].theta1, ax1.patches[0].theta2
center, r = ax1.patches[0].center, ax1.patches[0].r
bar_high=plt.axis()[3]
bar_low=plt.axis()[2]
#划下面的线
# 定义线的样式
def pie2bar_line(con):
    con.set_color(RGB_to_Hex('205,205,205'))
    con.set_linewidth(1)
    con.set_linestyle('--')
    ax2.add_artist(con)
x = r * np.cos(np.pi / 180 * theta2) + center[0]
y = np.sin(np.pi / 180 * theta2) + center[1]
con = ConnectionPatch(xyA=(0, bar_low), coordsA=ax2.transData,
                      xyB=(x, y), coordsB=ax1.transData)
pie2bar_line(con)
#划上面的线
x = r * np.cos(np.pi / 180 * theta1) + center[0]
y = np.sin(np.pi / 180 * theta1) + center[1]
con = ConnectionPatch(xyA=(0, bar_high), coordsA=ax2.transData,
                      xyB=(x, y), coordsB=ax1.transData)
pie2bar_line(con)
# 加文本标签
bar_max_width=max([i.get_width() for i in ax2.patches])
print(bar_max_width)
ax2.text(bar_max_width/2,bar_high+height,'兄弟姐妹数量',
    size=12,ha="center", va="center",
    bbox=dict(boxstyle="round",ec='white',fc='white'))
# 先保存再show,避免图片保存成空白
plt.savefig("pie_barh.png",dpi=600,bbox_inches = 'tight')
plt.show()

2.底图+柱形图+文本(pic_bar_text)

pic_bar_text.png
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import matplotlib.patches as patches
import matplotlib.cbook as cbook
import os
#设置字体、图形样式
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
# 数据
xlabel=["直辖市/省会城市","地级市","县城或县级市","乡镇","农村"]
gaozhong=[0.1662,0.2245,0.2737,0.0909,0.2447]
xianzai=[0.1715,0.2183,0.2628,0.097,0.2503]
# 设置
x=np.arange(len(xlabel))
bar_width=0.4
# 作图
fig=plt.figure()
# 加底图
ax=fig.add_subplot()
current_path=os.getcwd()
with cbook.get_sample_data(current_path+'\\china_map.png') as image_file:
    image = plt.imread(image_file)
im=ax.imshow(image,alpha=0.3)
ax.axis('off')
# 加柱状图
ax1=fig.add_subplot(212,facecolor=(1,1,1,0))#子图设置透明,显示出底图
rects1 = ax1.bar(x - bar_width/2, gaozhong, bar_width, 
    label='高中前居地',color=RGB_to_Hex('62,142,185'))
rects2 = ax1.bar(x + bar_width/2, xianzai, bar_width, 
    label='现居地',color=RGB_to_Hex('141,210,231'))
# 设置x轴
ax1.set_xticks(x)
ax1.set_xticklabels(xlabel)
# 去掉边框
ax1.spines['top'].set_visible(False)
ax1.spines['left'].set_visible(False)
ax1.spines['right'].set_visible(False)
# 加图例
ax1.legend(loc='center',ncol=2,edgecolor='w',bbox_to_anchor=(0.5,-0.25))
#不要y坐标上的label标签
plt.yticks(())
ax1.set_ylim([0,0.3])
# 加标签
font_size=9
for i,y in zip(x,gaozhong):
    ax1.text(i-bar_width/2,y+0.01,format(y,'.2%'),ha="center", va="center",size=font_size)
for i,y in zip(x,xianzai):
    ax1.text(i+bar_width/2,y+0.01,format(y,'.2%'),ha="center", va="center",size=font_size)
# 加线框
rect1_width=bar_width*7+0.15
rect1_height=max([i.get_height() for i in ax1.patches])+0.025
rect2_width=bar_width*5
rect2_height=rect1_height
rect1=patches.Rectangle([0-bar_width-0.1, 0], rect1_width, rect1_height,
    ec=RGB_to_Hex('62,142,185'),fc=(0,0,0,0))
ax1.add_patch(rect1)
rect2=patches.Rectangle([0-bar_width-0.1+rect1_width+0.02,0], rect2_width, rect2_height,
    ec=RGB_to_Hex('62,142,185'),fc=(0,0,0,0),linestyle='--')
ax1.add_patch(rect2)
# 加文本标签
ax2=fig.add_subplot(211,facecolor=(1,1,1,0))
ax2.axis('off')
# 文本内容
text1='城市'+'\n'+'前居地:'+format(sum(gaozhong[0:3]),'.2%')+'\n'+'现居地:'+format(sum(xianzai[0:3]),'.2%')
text2='农村'+'\n'+'前居地:'+format(sum(gaozhong[3:]),'.2%')+'\n'+'现居地:'+format(sum(xianzai[3:]),'.2%')
# 加本文
ax2.text(0.3,0.2,text1,
        size=12,ha="center", va="center",
        bbox=dict(boxstyle="round",ec=RGB_to_Hex('62,142,185'),fc=(1,1,1,0)))
ax2.text(0.8,0.2,text2,
        size=12,ha="center", va="center",
        bbox=dict(boxstyle="round",linestyle='--',ec=RGB_to_Hex('62,142,185'),fc=(1,1,1,0)))
plt.savefig("pic_bar_text.png",dpi=600,bbox_inches = 'tight')
plt.show()

3.多个条形图(multibarhs)

multibarh.png
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import matplotlib.transforms as mtransforms
#设置字体、图形样式
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
# 作图
fig=plt.figure()
def draw_barh(subplotid,category):
    ax=fig.add_subplot(subplotid)
    # plt.subplots_adjust(left=0.33,bottom=0.11) #调整子图
    # 自动调整子图
    labels=ax.set_yticklabels(ylabel)
    def on_draw(event):
        bboxes = []
        for label in labels:
            bbox = label.get_window_extent()
            # the figure transform goes from relative coords->pixels and we
            # want the inverse of that
            bboxi = bbox.inverse_transformed(fig.transFigure)
            bboxes.append(bboxi)
            # this is the bbox that bounds all the bboxes, again in relative
            # figure coords
            bbox = mtransforms.Bbox.union(bboxes)
            if fig.subplotpars.left < bbox.width:
                # we need to move it over
                fig.subplots_adjust(left=1.1*bbox.width)  # pad a little
                fig.canvas.draw()
    fig.canvas.mpl_connect('draw_event', on_draw)
    # 条形图
    barh1=ax.barh(ylabel,values1,label='乡村',color=RGB_to_Hex('84,155,193'))
    barh2=ax.barh(ylabel,values2,label='城市',left=values1,color=RGB_to_Hex('154,215,233'))
    # 去掉边框
    orientation=['top','bottom','right']
    for o in orientation:
        ax.spines[o].set_visible(False)
    # x轴没有标签
    ax.set_xticks(())
    # y轴标题
    ax.set_ylabel(category)
    # 添加barh的数据标签
    def text_center(ax,x,y,z,size):
        ax.text(x,y,format(z,'.2%'),size=size,ha="center", va="center",
                bbox=dict(boxstyle="round",ec=(0,0,0,0),fc=(0,0,0,0)))
    def add_barh_text(size):
        for b1,b2 in zip(barh1,barh2):
            width1=b1.get_width()
            width2=b2.get_width()
            text_center(ax,width1/2,b1.get_y()+(b1.get_height()/2),width1,size)
            text_center(ax,width2/2+width1,b2.get_y()+(b2.get_height()/2),width2,size)
    add_barh_text(9)
    return ax

# 数据
ylabel=['独立设置医科院校','综合性大学医学院']
values1=[0.3618109,0.6381891]
values2=[0.3905331,0.6094669]
category='类别'
subplotid=411
draw_barh(subplotid,category)

ylabel=['8年制','7年制','5年制']
values1=[0.2627856,0.3477032,0.4435133]
values2=[0.7372144,0.6522968,0.5564867]
category='层次'
subplotid=412
draw_barh(subplotid,category)

ylabel=['直辖市','东部','中部','西部']
values1=[0.154762,0.338909,0.330464,0.479900 ]
values2=[0.8452381,0.6610915,0.6695359,0.5201005]
category='地区'
subplotid=413
draw_barh(subplotid,category)

ylabel=['8年制','7年制','5年制']
values1=[0.243040,0.337754,0.368057]
values2=[0.7569601,0.6622458,0.6319435]
category='学制'
subplotid=414
ax=draw_barh(subplotid,category)
ax.legend(ncol=2, bbox_to_anchor=(0.4, -0.4),edgecolor='w',
              loc='lower center', fontsize='small')

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