Python matplotlib 绘图技巧总结 【持续更新中……】

正常显示中文

微软雅黑

plt.rcParams['font.sans-serif'] = ['SimHei']

宋体

plt.rcParams['font.sans-serif'] = ['SimSun']

如何设置中文宋体,英文新罗马字体,看这个链接:matplotlib如何设置中文为宋体,英文为新罗马Times New Roman

正常显示负号

plt.rcParams['axes.unicode_minus'] = False

隐藏右边框和上边框

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

将(0, 0)作为坐标原点

指定 x 轴绑定到 y 轴的 0 这个点上,指定 y 轴绑定到 x 轴的 0 这个点上

ax = plt.gca()
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))

隐藏刻度线

ax = plt.gca()
ax.xaxis.set_ticks_position('none')
ax.yaxis.set_ticks_position('none')

右侧和上侧也显示刻度

ax = plt.gca()
ax.tick_params(axis='both', which='both', direction='in')
ax.xaxis.set_ticks_position('both')
ax.yaxis.set_ticks_position('both')

坐标半刻度

ax = plt.gca()
ax.set_yticks(np.arange(10, 100, 20), minor=True)

其中10是第一个半刻度的坐标值

坐标双刻度

fig, ax1 = plt.subplots(figsize=(10, 5))
ax1.plot(x, y1)

ax2 = ax1.twinx()
ax2.plot(x, y2, color='r')

坐标双刻度时显示图例

fig, ax1 = plt.subplots(figsize=(10, 5))
line1, = ax1.plot(x, y1)

ax2 = ax1.twinx()
line2, = ax2.plot(x, y2, color='r')

plt.legend(handles=[line1, line2])

特别注意line1line2后面的这个逗号,否则会报错

设置颜色

详见 plt颜色设置及Matplotlib颜色对照表

柱状图

为不同柱子设定指定的颜色:

bars = plt.bar(x, data, width=0.2)
for i, bar in enumerate(bars):
    if i < 12:
        bar.set_facecolor('#ce3024')
    elif i < 17:
        bar.set_facecolor('#4f4f4f')
    else:
        bar.set_facecolor('#466b98')

结果如下图所示:
在这里插入图片描述

marker设置空心

plt.plot(x, y, marker='o', markeredgecolor='blue', markerfacecolor=(0, 0, 0, 0))

其中,markeredgecolor表示边缘颜色,设置为实际需要的颜色,markerfacecolor表示填充颜色,设置为透明,即可呈现空心效果:
在这里插入图片描述

图例常用设置

plt.legend(bbox_to_anchor=(1.01, 1.0), ncol=4, loc='upper left')
plt.tight_layout()

若需要将图例放置在图表的外部,可以用bbox_to_anchor设置,大于1的数值表示在图表外部。注意如果放置在图表外部发现显示不全,可以用plt.tight_layout()解决这一问题
ncol用于设置图例的列数,loc表示放置图例的位置

有时图例显示的顺序与代码绘图的先后顺序不一致,如果要指定图例的顺序,可以使用handles参数,例如:

bars = plt.bar(x1, data1, label='bar')
line, = plt.plot(x2, data2, label='line')
plt.legend(handles=[bars, line])

需要注意line后的逗号必须加上,否则会报错
对于箱型图,则需要取出boxes['boxes']

boxes = plt.boxplot(data)
plt.legend(handles=boxes['boxes'], labels=['pass', 'fail'])

我发现箱型图只能通过这种方式显示图例,直接plt.legend()会报错说找不到标签,即使是plt.boxplot中设置了labels参数

设置图例无边框:

plt.legend(frameon=False)

Latex 语法

如果绘图时标签等文本出现上下标等,需要使用Latex语法,在字符串的前后加上$符号,中间即可使用Latex语法,如下设置包含下标的y轴标签:

label = r'$T_{ci}(K)$'
plt.ylabel(label)

结果如图所示:
在这里插入图片描述
如果遇到既需要用Latex语法,又含有变量,需要写两个大括号:

label = fr'$T_{{XZ}}={m:.4f}T_{{SX}}{c:.4f}$' + '\n' + fr'$r^2={fit_similarity:.4f}$'
axins.plot(y2, fit_line, color='black', linestyle='-', label=label)

结果如图所示:
在这里插入图片描述

局部放大

首先创建局部放大图,(0.35, 0.08, 0.4, 0.4)四元组中前2个参数分别表示图左下角的x坐标、y坐标,后2个参数分别表示图的长度和宽度(顺序有可能记错了),根据实际情况调整。

ax = plt.gca()
axins = ax.inset_axes((0.35, 0.08, 0.4, 0.4))

之后跟绘制大图一样,比如axins.plot绘制折线图即可。

调整子图间距

plt.tight_layout()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.1, hspace=0.25)

wspace表示子图左右之间的距离,hspace表示子图上下之间的距离

子图大小不规则

from matplotlib import gridspec

spec = gridspec.GridSpec(ncols=2, nrows=2, width_ratios=[2, 1], height_ratios=[1, 2], wspace=0.5, hspace=0.5)
plt.subplot(spec[0])
...
plt.subplot(spec[3])

width_ratiosheight_ratios分别设置子图的宽度与高度比例,之后原本用于绘制第一个子图的语句plt.subplot(2, 2, 1)替换成plt.subplot(spec[0])即可

横坐标为时刻数据

import matplotlib.dates as mdates
import datetime

# 将时间字符串转换为 datetime 对象
time_objects = [datetime.datetime.strptime(t, '%H:%M') for t in time_strings]
# 将 datetime 对象转换为 matplotlib 能识别的日期格式
times = mdates.date2num(time_objects)

ax = plt.gca()
# 设置主刻度为每 4 小时
ax.xaxis.set_major_locator(mdates.HourLocator(interval=4))
# 设置时间标签显示格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))

plt.plot(times, y)

效果如下图所示:
在这里插入图片描述

Pandas 文件读写

写文件

import pandas as pd

data = {}
data['x'] = [1, 2, 3]
data['y'] = [0.1, 0.2, 0.3]
df = pd.DataFrame(data)
save_path = 'test.xlsx'
df.to_excel(save_path, index=False)

如果列长度不相等:

import pandas as pd

data = {}
data['x'] = [1, 2, 3]
data['y'] = [0.1, 0.2, 0.3]
data2 = {}
data2['z'] = [4, 5]
df = pd.concat([pd.DataFrame(data), pd.DataFrame(data2)], axis=1)
save_path = 'test.xlsx'
df.to_excel(save_path, index=False)

分组

x_label = '年份'
label1 = '农村家庭可支配(元)'
label2 = '城市家庭可支配(元)'
# 按年份分组并计算平均值
grouped_df = df.groupby(x_label).agg({label1: 'mean', label2: 'mean'}).reset_index()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值