python画图:matpolt,设置图片尺寸,字体大小,副坐标轴,保存

文章重心:

  • 写论文的时候,图片的大小,字体的大小,副坐标轴,这些都是很重要的因素,保存一下之前用过的画图代码
  • 单图
  • 多图(两个子图)
  • 堆叠柱状图
  • 两个Y轴的图

问题:

  • python保存的时候,我选择的是svg,但是这样图片会比较大,查重什么的需要把图片都删了(一般有文件大小限制),虽然不影响,但是让人不爽,有博主分享了怎么保存为emf
  • python保存的图,有时候需要裁剪一下,不然边上留白比较多

单图示例

import numpy as np
from matplotlib import pyplot as plt
# 设置显示中文字体
plt.rcParams['font.family'] = ['SimSun', 'Times New Roman']  # 中文为SimSun,英文为Times New Roman
plt.rcParams['mathtext.fontset'] = 'stix'  # 设置数学公式字体为stix
# 设定的图片宽度
width_cm = 12
high_cm = 6
# 设置图的大小,将宽度转换为英寸
fig, ax = plt.subplots(figsize=(width_cm / 2.54, high_cm / 2.54))  # 6是一个示例高度
# 设置全局字体大小
plt.rc('font', size=10.5)
# 关闭自动缩放字体大小的功能
plt.rcParams['font.size'] = 10.5  # 字体大小为10.5磅
plt.rcParams['axes.titlesize'] = 10.5  # 坐标轴标题的字体大小为10.5磅
time_scope = range(24)
# 在主坐标轴上绘制曲线图
plt.plot(time_scope, np.zeros(24), linestyle='--', linewidth=1.5, color='gray')
plt.plot(time_scope, range(24), label='ESS功率', linestyle='-', linewidth=1.5, color='red')
# 设置次坐标轴的y轴标签
plt.xlabel('时间(h)')
plt.ylabel('功率(kW)')
# 添加曲线图的图例
plt.legend(loc='upper left', frameon=False, fancybox=False, shadow=False)
# 设置主坐标轴的刻度
plt.xlim(-0.5, 23.5)
plt.xticks(range(0, 24, 2))
# 启用副刻度线
plt.minorticks_on()
plt.xticks(range(0, 24, 1), minor=True)
plt.yticks([x / 2 for x in range(-0 * 2, 24 * 2, 5)])
# plt.yticks([x / 2 for x in range(-0 * 2, 25 * 2 + 1, 2)], minor=True)
# 调整 Matplotlib 的显示设置,紧凑
plt.tight_layout()
plt.savefig( '图片.svg', dpi=500)
plt.show()

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

多图示例

两个子图,但是实际上画一个图就够了,在word里面再排版会更好:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.gridspec import GridSpec

# 设置显示中文字体
plt.rcParams['font.family'] = ['SimSun', 'Times New Roman']  # 中文为SimSun,英文为Times New Roman
plt.rcParams['mathtext.fontset'] = 'stix'  # 设置数学公式字体为stix
# 设定的图片宽度
width_cm = 14
# 设置图的大小,将宽度转换为英寸
fig, ax = plt.subplots(figsize=(width_cm / 2.54, width_cm / 2.54 / 8 * 6))  # 6是一个示例高度
# 设置全局字体大小
plt.rc('font', size=10.5)
# 关闭自动缩放字体大小的功能
plt.rcParams['font.size'] = 10.5  # 字体大小为10.5磅
plt.rcParams['axes.titlesize'] = 10.5  # 坐标轴标题的字体大小为10.5磅
time_scope = range(24)

# 使用GridSpec定义网格布局,两行一列
gs = GridSpec(2, 1, height_ratios=[1, 1.5], hspace=0.3)

# 第一个子图,曲线图
ax1 = plt.subplot(gs[0])
# 在主坐标轴上绘制曲线图
# ax1.bar(time_scope, data[f'ESS功率'], label='ESS功率', linestyle='-', linewidth=1.5, color='red')
ax1.plot(time_scope, np.zeros(24), linestyle='--', linewidth=1.5, color='gray')
ax1.plot(time_scope, np.random.uniform(-3, 3, 24), label='优化EV功率', linestyle='-', linewidth=1.5)
ax1.plot(time_scope, np.random.uniform(-3, 3, 24), label='传统EV功率', linestyle='-', linewidth=1.5)
# 设置次坐标轴的y轴标签
ax1.set_ylabel('功率(kW)')
# 设置主坐标轴和次坐标轴的y轴刻度一致
ax1.set_yticks([x / 2 for x in range(-5 * 2, 10 * 2, 5)])
# 启用副刻度线
ax1.minorticks_on()
ax1.set_yticks([x / 2 for x in range(-5 * 2, 10 * 2, 1)], minor=True)
# 添加曲线图的图例
ax1.legend(frameon=False, fancybox=False, shadow=False)
# 第二个子图,柱形图
ax2 = plt.subplot(gs[1], sharex=ax1)
# 设置第一个数据集的条形图
ax2.bar(time_scope, np.random.uniform(-3, 3, 24), label='优化SOC', width=0.4, align='center')
# 设置第二个数据集的条形图,微调位置
ax2.bar([x + 0.4 for x in time_scope], np.random.uniform(-3, 3, 24), label='传统SOC', width=0.4, align='center')
ax2.set_xlabel('时间(h)')
ax2.set_ylabel('储能状态(kWh)')
# 设置主坐标轴的刻度
ax2.set_xlim(-0.5, 23.5)
ax2.set_xticks(range(0, 24, 2))
ax2.set_yticks([x / 2 for x in range(-3 * 2, 3 * 2 + 1, 2)])
# 启用副刻度线
ax2.minorticks_on()
ax2.set_xticks(range(0, 24, 1), minor=True)
ax2.set_yticks([x / 2 for x in range(-3 * 2, 3 * 2 + 1, 1)], minor=True)
# 添加柱形图的图例
ax2.legend(frameon=False, fancybox=False, shadow=False)
# 调整 Matplotlib 的显示设置
plt.tight_layout()
plt.savefig('图片2.svg', dpi=500)
plt.show()

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

堆叠柱状图示例


import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

iteration = 0
'''读取功率'''
bar_data = pd.DataFrame()
for i in range(10):
    bar_data[f'data{i + 1}'] = np.random.uniform(-1, 3, 24)
'''绘图'''
time_scope = range(24)
# 设置显示中文字体
plt.rcParams['font.family'] = ['SimSun', 'Times New Roman']  # 设置字体族,中文为SimSun,英文为Times New Roman
plt.rcParams['mathtext.fontset'] = 'stix'  # 设置数学公式字体为stix
# 设定的图片宽度
width_cm = 20
# 设置图的大小,将宽度转换为英寸
plt.figure(figsize=(15 / 2.54, 10 / 2.54 / 8 * 6))  # 6是一个示例高度,可以根据需要调整
# 设置全局字体大小
plt.rc('font', size=10.5)
# 关闭自动缩放字体大小的功能
plt.rcParams['font.size'] = 10.5  # 设置字体大小为10.5磅
plt.rcParams['axes.titlesize'] = 10.5  # 设置坐标轴标题的字体大小为10.5磅
width = 0.4
# 初始化底部位置
bottom_positions_positive = np.zeros(24)
bottom_positions_negative = np.zeros(24)
# 自定义颜色
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', '#FFA07A', '#20B2AA', '#6495ED',
          '#B0C4DE', '#9370DB', '#F08080', '#778899', '#48D1CC', '#FF69B4',
          '#DAA520', '#808080', '#CD5C5C', '#9ACD32', '#FF6347', '#008080',
          '#FF4500', '#D8BFD8', '#8B4513', '#87CEEB', '#FF1493', '#8A2BE2',
          '#32CD32', '#FF8C00']
# 创建堆叠柱状图
for i, (series_name, series_data) in enumerate(bar_data.items()):
    positive_values = np.maximum(series_data, 0)
    negative_values = np.minimum(series_data, 0)

    plt.bar(time_scope, positive_values, label=series_name, bottom=bottom_positions_positive,
            color=colors[i % len(colors)],
            )
    plt.bar(time_scope, negative_values, bottom=bottom_positions_negative,
            color=colors[i % len(colors)],
            )
    bottom_positions_positive += positive_values
    bottom_positions_negative += negative_values
# 添加标签和图例
plt.xlabel('时间(h)')
plt.ylabel('功率(kW)')
# 图例
plt.legend(frameon=False, fancybox=False, shadow=False, ncol=2, bbox_to_anchor=(1.03, 1),
           loc='upper left', fontsize='small')

plt.xlim(-0.5, 23.5)
# 设置主要刻度线
plt.xticks(range(0, 24, 2))
# plt.yticks(range(-5, 20, 2))
plt.minorticks_on()
plt.xticks(range(0, 24, 1), minor=True)
plt.tight_layout()
plt.savefig('图片3.svg', dpi=500)
plt.show()

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

两个y轴

plt.rcParams['font.family'] = ['SimSun', 'Times New Roman']  # 设置字体族,中文为SimSun,英文为Times New Roman
plt.rcParams['mathtext.fontset'] = 'stix'  # 设置数学公式字体为stix
width_cm = 12
plt.figure(figsize=(width_cm / 2.54, width_cm / 2.54 / 8 * 5.5))  # 6是一个示例高度,可以根据需要调整
plt.rc('font', size=10.5)
plt.rcParams['font.size'] = 10.5  # 设置字体大小为10.5磅
plt.rcParams['axes.titlesize'] = 10.5  # 设置坐标轴标题的字体大小为10.5磅
bar_width = 0.35
x = range(24)
# 定义第二个柱状图X坐标的偏移量
x_offset = [pos + bar_width for pos in x]
# 画出两个柱状图
plt.bar(x, np.random.uniform(5, 10, 24), width=bar_width, label='功率1', color='#FFBE7A')
plt.bar(x_offset, np.random.uniform(4, 8, 24), width=bar_width, label='功率2', color='#82B0D2')
# 设置横纵坐标轴
plt.xlabel('时间(h)')
plt.ylabel('功率(kW)')
plt.xlim(-0.5, 23.5)
plt.xticks(range(0, 24, 2))
plt.yticks(range(0, 11, 2))
plt.minorticks_on()
plt.xticks(range(0, 24, 1), minor=True)
handles, labels = plt.gca().get_legend_handles_labels()
# 创建一个新的y轴
ax2 = plt.twinx()
ax2.plot(range(24), np.random.uniform(3, 10, 24), color='red', label='电价',
         linestyle='--')
# 设置新的y轴坐标
ax2.set_ylabel('电价(¥/kWh)')
ax2.set_ylim(0, 15)
# 把两个图的图例合并起来一起输出
handles2, labels2 = ax2.get_legend_handles_labels()
handles += handles2
labels += labels2
plt.legend(handles, labels, loc='upper left', frameon=False, fancybox=False, shadow=False,
           ncol=3, fontsize='small')
plt.tight_layout()
# 保存并输出图片
plt.savefig(f"图片4.svg", dpi=500)
plt.show()

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值