python 画直方图

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from datetime import datetime
import open_file

fig = plt.figure(figsize=(20, 10))

#  定义 x 轴数据
lat_x = [i for i in range(9, 55)]    
lon_x = [i for i in range(74, 135, 2)]
# 从文件读取数据
xn_lat, xn_lon = open_file.open_xn('int')
ys_lat, ys_lon = open_file.open_ys('int')
# 定义 y 轴数据
xn_lat_y = [i for i in map(lambda x: xn_lat.count(x)+ys_lat.count(x), lat_x)]   # 找到 lat_x 在数据 纬度xn_lat  中的个数  
xn_lon_y = [i for i in map(lambda x: xn_lon.count(x)+ys_lon.count(x), lon_x)]

ys_lat_y = [i for i in map(lambda x: ys_lat.count(x), lat_x)]
ys_lon_y = [i for i in map(lambda x: ys_lon.count(x), lon_x)]

dpi, width = 400, 0.4  # 分辨率,柱子宽度
plt.rc('font', family='SimHei', size=12)  # 设置中文显示,否则出现乱码
ax1 = plt.subplot(2, 1, 1)  # ('行','列','编号')  2 行 1 列 第 1 个 pu/rple
plt.bar(x=lon_x, height=ys_lon_y, width=width, label='填补前站数', fc='purple')
for i in range(len(lon_x)):   # 双柱图width  # 不加这段,双柱图会重叠,x 参数 其实就是设置它显示柱子的x轴的起始点,第一个为lon_x的 74 开始到加 width的0.4 结束  
    lon_x[i] = lon_x[i] + width                                                                    第二个为lon_x的 74+0.4 开始到加 width的0.4 结束

plt.bar(x=lon_x, height=xn_lon_y, width=width , label='填补后站数', fc='green')
plt.xticks([i for i in range(74, 135, 2)])  # 设置x轴上显示的值
# 设置横轴标签
plt.xlabel('经度(° E)')
# 设置纵轴标签
plt.ylabel('站点个数')
# 添加标题
plt.title('站点随经度变化')
plt.legend()  # 设置图例,就是让 label  画出来


ax2 = plt.subplot(2, 1, 2)  # ('行','列','编号')
plt.bar(x=lat_x, height=ys_lat_y, width=width, label='填补前站数', fc='purple')
for i in range(len(lat_x)):
    lat_x[i] = lat_x[i] + width
plt.bar(x=lat_x, height=xn_lat_y, width=width, label='填补后站数', fc='green')
plt.xticks([i for i in range(9, 55)])  # 设置x轴上显示的值

# 设置横轴标签
plt.xlabel('纬度(° N)')
# 设置纵轴标签
plt.ylabel('站点个数')
# 添加标题
plt.title('站点随纬度变化')
plt.legend()   # 让 label  画出来  loc='upper right'  设置图例在哪里



out_file = '%s_%s_%s.png' % (datetime.now().strftime('%Y%m%d%H%M&S'), width, dpi)
plt.savefig(out_file, transparent=True, bbox_inches='tight', dpi=dpi, pad_inches=0.0, set_visiable=False, format='png')
# plt.show()

 

import matplotlib.pyplot as plt
import numpy as np
#柱状图分成上下两部分,每一个柱体上都有相应的数值标注,并且取消坐标轴的显示。
#向上向下分别生成12个数据,X为 011 的整数 ,Y是相应的均匀分布的随机数据。 
#使用的函数是plt.bar,参数为X和Y:
n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1)
plt.bar(X, -Y2)

plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

plt.show()

#下面我们就颜色和数值进行优化。 用facecolor设置主体颜色,edgecolor设置边框颜色为白色
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
#接下来我们用函数plt.text分别在柱体上方(下方)加上数值,用%.2f保留两位小数,
#横向居中对齐ha='center',纵向底部(顶部)对齐va='bottom'
for x, y in zip(X, Y1):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va='top')

 

 

 

参数  说明 类型
x x坐标  int,float
height 条形的高度 int,float
width 线条的宽度 0~1,默认是0.8
botton 条形的起始位置 也就是y轴的起始坐标
align 条形的中心位置 “center”,"lege"边缘
color 条形的颜色 “r”,“b”,“g”,“#123465",默认的颜色是“b”
edgecolor 边框的颜色 同上
linewidth 边框的宽度 像素,默认无,int
tick_label 下标的标签 可以是元组类型的字符组合
log y轴使用科学计算法表示 bool
orientation 是竖直条还是水平条 竖直:"vertical",水平条:"horizontal"

 

参考:https://www.jb51.net/article/142486.htm

           https://www.jianshu.com/p/364e2121ee94

posted on 2020-08-20 10:07  闹不机米  阅读(773)  评论(0编辑  收藏  举报

导航