python中的折线图、散点图、直方图绘制和图像参数设置

写在前面
本文是在实验过程中进行简单数据处理时,使用的部分画图程序,涉及折线图、散点图、直方图。所用数据均保存在txt文档中。在函数使用过程中也曾遇到问题,这里的程序是测试可用的, 或可作为借鉴。

环境

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy.optimize import curve_fit as cf
import matplotlib.ticker as ticker

折线图和图中箭头

数据读取

path = 'D:/python_result/Calibration/'
inch3 = open(path + '3-inch.txt')
font = {'weight': 'normal', 'size': 30} # 字体
inch3.readline().split()

用到的数据在txt文档里按行存储,一行是一组数据,并且每相邻两行数据是一样的。

['0.378375',
 '0.3795',
 '0.3840625',
 '0.3799375',
 '0.364625',
 '0.358625',
 '0.34175',
 '0.339125',
 '0.3423125',
 '0.353',
 '0.3696875']

画图

画图过程简单,只是选取数据plot就好

x = [0, -7, -24, -40, -50, -59.5, -70, -80, -108.2, -131.8, -146.8]
label = [20, 13, -4, -20, -30, -39.5, -50, -50, -21.8, 1.8, 16.8]
fig = plt.figure(figsize=(20, 12))
ax = fig.add_subplot(1, 1, 1)
for tmp in inch3.readlines():
    tmp = list(map(float, tmp.split()))
    if i % 2 == 0:
        plt.plot(x, tmp, linewidth=1.5, marker='o', markersize=10)
    i += 1
plt.plot([-70, -70], [-0.5, 1.1], color='blue', linewidth=2.5, linestyle='--')
plt.plot([-80, -80], [-0.5, 1.1], color='red', linewidth=2.5, linestyle='--')

这是调整参数之前的效果,可以看出来x,y轴的范围以及坐标轴上ticks的大小都要调整
调整参数之前

设置图像参数

参数实际上是在图已经画出来之后调整的,依据需要的效果

ax.set_xlabel(r'$^\circ$C', font) # x轴label,font是之前声明的字体属性
ax.set_ylabel(r'Gain of 3-inch PMTs ($1\times10^7$)', font) # y轴label
plt.tick_params(labelsize=30) # 坐标轴ticks的字体大小
plt.grid(linestyle='--') # figure中的网格线
plt.xlim(5, -150) # x轴范围
plt.ylim(0.2, 0.85) # y轴范围
plt.xticks(x, label) # 修改x轴的ticks

这是调整参数之后的效果
调整参数之后

根据需要在图中添加箭头

为了更好的说明图中展示的数据,需要在其中加上箭头以及文字说明,用到的是matplotlib.pyplot.annotate函数,可以点击查看其参数说明。不过使用过程中发现,xytext参数,也就是设置文本显示坐标的参数,其坐标单位和图中的坐标并不匹配,因此是不断修改尝试而得到想要的结果的。

ax.annotate('Cooling process', xy=(-70, 0.506),
            xytext=(0.25, 0.45), textcoords='axes fraction',
            arrowprops=dict(facecolor='blue', shrink=0.05),
            fontsize=25,
            horizontalalignment='center', verticalalignment='bottom')
ax.annotate('', xy=(-18, 0.506),
            xytext=(0, 0.47), textcoords='axes fraction',
            arrowprops=dict(facecolor='blue', shrink=0.05),
            fontsize=25,
            horizontalalignment='center', verticalalignment='bottom')
ax.annotate('Heating process', xy=(-150, 0.506),
            xytext=(0.75, 0.45), textcoords='axes fraction',
            arrowprops=dict(facecolor='red', shrink=0.05),
            fontsize=25,
            horizontalalignment='center', verticalalignment='bottom')
ax.annotate('', xy=(-96, 0.506),
            xytext=(0.55, 0.47), textcoords='axes fraction',
            arrowprops=dict(facecolor='red', shrink=0.05),
            fontsize=25,
            horizontalalignment='center', verticalalignment='bottom')

加上箭头以及文字说明的效果
带有箭头和文字说明
至此完成。

散点图

数据读取

path = 'D:/python_result/'
hv1_1 = np.loadtxt(path + 'HV1_1.txt', encoding='utf-8', delimiter='\t')
hv2_1 = np.loadtxt(path + 'HV2_1.txt', encoding='utf-8', delimiter='\t')
hv3_1 = np.loadtxt(path + 'HV3_1.txt', encoding='utf-8', delimiter='\t')
date = np.loadtxt(path + 'Date_1.txt', encoding='utf-8', delimiter='\t', dtype=str).astype(str)
font = {'weight': 'normal', 'size': 30} # 字体

hv1_1长这样
hv1_1
date长这样
date

画图

散点图选择数据scatter就好

fig = plt.figure(figsize=(20, 12))
ax = fig.add_subplot(1, 1, 1)
ax.scatter(date, hv1_1, s=30, c='r', marker='.', label='PMTID 80010', linewidth=3)
ax.scatter(date, hv2_1, s=30, c='b', marker='.', label='PMTID 80061', linewidth=3)
ax.scatter(date, hv3_1, s=30, c='k', marker='.', label='PMTID 80064', linewidth=3)

此时的图长这样,横坐标是日期信息,太密了,什么都看不出来,并且有三组信息但是缺少legend,还有坐标轴范围和ticks的字体大小需要调整
参数修改之前

设置图像参数

将之前的图像添加了坐标轴的label、网格线、legend,并修改了坐标轴范围、坐标轴ticks的字体大小和横坐标的疏密度

ax.set_xlabel('Date', font)
ax.set_ylabel('HV / V', font)
plt.tick_params(labelsize=30)
ax.xaxis.set_major_locator(ticker.MultipleLocator(68)) # 用来修改横坐标的疏密度
plt.legend(prop=font, loc='upper right')
plt.ylim(900, 1350)
plt.grid(linestyle='--')

此时的样子
参数修改之后

直方图和拟合

数据获取

这里的直方图使用的数据和前面的散点图是同样的

path = 'D:/python_result/'
hv1_1 = np.loadtxt(path + 'HV1_1.txt', encoding='utf-8', delimiter='\t')
hv2_1 = np.loadtxt(path + 'HV2_1.txt', encoding='utf-8', delimiter='\t')
hv3_1 = np.loadtxt(path + 'HV3_1.txt', encoding='utf-8', delimiter='\t')
date = np.loadtxt(path + 'Date_1.txt', encoding='utf-8', delimiter='\t', dtype=str).astype(str)

画图

使用hist画图

fig = plt.figure(figsize=(20, 12))
ax = fig.add_subplot(1, 1, 1)
mu = np.mean(hv1_1)
sigma = np.std(hv1_1)
par1 = ax.hist(hv1_1, **params, color='r', label='$\mathrm{PMTID\ 80010}$\n$Mean=%.1f$\n$RMS=%.1f$' % (mu, sigma), 
        linewidth=5, range=(1000, 1300))

此时的直方图中,没有legend,没有坐标轴label,坐标轴ticks字体大小不够,并且还为做拟合。
未调整的直方图

设置图像参数

添加坐标轴label,修改坐标轴ticks字体大小

ax.set_xlabel('HV / V', font)
ax.set_ylabel('Counts', font)
plt.tick_params(labelsize=30)

设置图像参数

拟合并绘制拟合图像

使用的拟合函数是高斯函数

def gaussian(x, *param):
    return param[0]*np.exp(-np.power(x - param[1], 2.) / (2 * np.power(param[2], 2.)))

拟合并获得拟合得到的参数,绘制拟合结果,添加legend。

x = np.linspace(mu - 50, mu + 50, 1000)
# curve_fit的返回值中para是拟合参数,pco是方差-协方差矩阵,可以通过对pco的对角元开方得到拟合参数的标准差作为拟合误差
para, pco = cf(gaussian, par1[1][0: len(par1[0])], par1[0], p0=[70, mu, sigma])
mu = para[1]
sigma = para[2]
plt.legend(labels=['$\mathrm{PMTID\ 80010}$\n$\mu=%.1f$\n$\sigma=%.1f$' % (mu, sigma)], prop=font)
plt.plot(x, gaussian(x, *para), color='orange', linewidth=3)

在这里插入图片描述

待续

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值