【python实战】matplotlib绘图(一)

上次用pyecharts画了地图,【python实战】 pyecharts绘制地图
虽然很好看,但是,考虑到渲染成图片时间比较长,因此,要是要批量作图的话,还是用matplotlib比较好,就像之前的Python批量word报告(带图)【思路篇】
,也是用的matplotlib。

matplotlib算是很底层的包了,好处在于个性化设置上更灵活,缺点可能是要写的代码更多些吧,但是,总的来说,瑕不掩瑜。

在学着用matplotlib作图的时候,主要是看matplotlib(https://matplotlib.org/index.html)里面的例子以及相应的文档。但不得不说,里面的文档真的挺难看的,pyecharts的就好看多了。另外就是加上搜索引擎了。

这里放两个最近用到的图。

1.条形图(broken_barh)

broken_barh.png
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.lines as lines

# 颜色转换
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

#设置字体、图形样式
# sns.set_style("whitegrid")
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False

# 数据
data={
        "data": [
            {"name":'全省',"5pct": 354, "mean":500,"95pct":684},
            {"name":'全市',"5pct": 342, "mean":511,"95pct":668},
            {"name":'A县',    "5pct": 327, "mean":514,"95pct":661}
        ],
    }

# 数据设置
ylabel=[d["name"] for d in data['data']]
pct5=[d["5pct"] for d in data['data']]
pct95=[d["95pct"] for d in data['data']]
mean=[d["mean"] for d in data['data']]
xbar=[(d["5pct"],d["95pct"]-d["5pct"]) for d in data['data']]

# 属性设置
yticks=[5,10,15]
xlim=(min(pct5)-100,max(pct95)+100)
colors=[RGB_to_Hex('255,140,0'),RGB_to_Hex('107,142,35'),RGB_to_Hex('116,162,221')]
barheight=2

# 作图
# 设置图形大小
plt.rcParams['figure.figsize'] = (6,2.5) 
fig, ax = plt.subplots()
for i in range(len(xbar)):
    ax.broken_barh([xbar[i]],(4+i*5,barheight),facecolors=(colors[i]))
    # 加标签
    ax.text(pct5[i]-40,yticks[i]-0.2,str(pct5[i]),size=10)
    ax.text(pct95[i]+10,yticks[i]-0.2,str(pct95[i]),size=10)
    ax.text(mean[i]-30,yticks[i]-0.2,str(mean[i]),size=10,color='black')
    # 加竖线
    line = lines.Line2D([mean[i],mean[i]], [4+i*5,4+i*5+barheight],
                    lw=1, color='black', axes=ax)
    ax.add_line(line)

# 去掉边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

#设置x轴取值范围,y轴间隔及标签
ax.set_xlim(xlim)
ax.set_yticks(yticks)
ax.set_yticklabels(ylabel)

plt.savefig("broken_barh.png",dpi=600,bbox_inches = 'tight')
plt.show()

2.散点图(scatter)

scatter.png
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.lines as lines
from matplotlib.ticker import FuncFormatter

# 颜色转换
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

#设置字体、图形样式
# sns.set_style("whitegrid")
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False

# 数据(太多了,就只放三条吧)
data={
        "data": [
        {"校间差异":0.135311972763609,"全省其他县":0,"你市各县":577.362102747501,"你市":0},
        {"校间差异":0.0616036942022612,"全省其他县":0,"你市各县":546.788848220486,"你市":0},
        {"校间差异":0.209066958823479,"全省其他县":0,"你市各县":517.929672671431,"你市":0}
    }

# 数据设置
x=[d["校间差异"] for d in data['data']]
y1=[d["全省其他县"] for d in data['data'] ]
y2=[d["你市各县"] for d in data['data']]
y3=[d["你市"] for d in data['data']]
label=["全省其他县","你市各县","你市"]


# 作图
# 设置图形大小
plt.rcParams['figure.figsize'] = (8,6) 
fig, ax = plt.subplots()
ax.scatter(x,y1,c=RGB_to_Hex('79,129,189'),label=label[0])
ax.scatter(x,y2,c=RGB_to_Hex('0,176,80'),label=label[1])
ax.scatter(x,y3,c=RGB_to_Hex('228,108,10'),marker='^',label=label[2])

# 去掉边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

#添加图例
ax.legend(loc=9,ncol=3,edgecolor='grey',bbox_to_anchor=(0.5,1.1))

#设置y轴取值范围
ylim=[400,600]
xlim=[0,0.4]
ax.set_ylim(ylim)
ax.set_xlim(xlim)

# x轴以百分比的形式呈现
def to_percent(temp, position):
    return '%.2f'%(10*temp) + '%'
plt.gca().xaxis.set_major_formatter(FuncFormatter(to_percent))

# 添加x和y轴名称
ax.set_xlabel('校间差异',weight='bold',size=12)
ax.set_ylabel('语文成绩',weight='bold',size=12,rotation='vertical')

# 加虚线
linecolor=RGB_to_Hex('79,129,189')
linestyle='--'
line_pos=[0.1,0.2,450,550]
for i in range(2):
    line = lines.Line2D([line_pos[i],line_pos[i]],ylim,lw=0.5, color=linecolor, axes=ax,linestyle=linestyle)
    ax.add_line(line)
for i in range(2,4):
    line = lines.Line2D(xlim,[line_pos[i],line_pos[i]],lw=0.5, color=linecolor, axes=ax,linestyle=linestyle)
    ax.add_line(line)

# 添加文本
ax.text(0,ylim[1]-10,'校间差异小,\n语文成绩高',size=12,color=RGB_to_Hex('79,129,189'),fontweight='bold')
ax.text(0,ylim[0]+10,'校间差异小,\n语文成绩低',size=12,color='red',fontweight='bold')
ax.text(xlim[1]-0.04,ylim[0]+10,'校间差异大,\n语文成绩低',size=12,color='red',fontweight='bold')
ax.text(xlim[1]-0.04,ylim[1]-10,'校间差异大,\n语文成绩高',size=12,color='red',fontweight='bold')

plt.savefig("scatter.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