matplotlib学习笔记

本文详细介绍了如何使用Python的matplotlib库绘制折线图、散点图和条形图。包括设置图像质量、坐标轴、添加图例、调整字体以及绘制网格等操作。示例代码中还展示了如何处理中文标签,避免乱码问题。

用matplotlib画图

1.绘制折线图

import random
from matplotlib import pyplot as plt
x = range(120)
y = [random.randint(20,35) for i in range(120)
plt.plot(x,y)
plt.show()

更换图片质量

plt.figure(figsize=(20,8),dpi=80)

更换横纵坐标

plt.xticks(range(0,121,10))

保存

plt.savefig("fig1.png")

在这里插入图片描述

横坐标字符串形式

由于matpotlib不支持中文格式,会导致乱码问题,采用系统自带的字体。

my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STSONG.TTF")
#更换横纵坐标
_x = list(x)[::10]
_xtick_lables = ["10点{}分".format(i) for i in range(60)]
_xtick_lables += ["11点{}分".format(i) for i in range(60)]
plt.xticks(_x,_xtick_lables[::10],rotation=45,fontproperties=my_font) #斜着字体,步长为10

在这里插入图片描述

添加描述信息

#添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 单位('C)",fontproperties=my_font)

绘制网格

#绘制网格
plt.grid()

一个小例子

from matplotlib import pyplot as plt, font_manager
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STSONG.TTF")
x = range(11,31)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
plt.figure(figsize=(20,8),dpi=80)
_xlables = ["{}岁".format(i) for i in range(11,31)]
plt.xticks(list(x),_xlables,fontproperties=my_font)
plt.xlabel("time")
plt.ylabel("count")
plt.plot(x,y)
plt.show()

在这里插入图片描述

添加图例

plt.legend(prop=my_font)
from matplotlib import pyplot as plt, font_manager

my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STSONG.TTF")
x = range(11,31)
y1 = [1,0,1,1,2,5,3,2,3,8,4,1,4,5,4,3,3,2,1,1]
y2 = [0,0,2,1,2,4,3,8,3,4,2,5,6,6,4,3,3,1,1,5]
plt.figure(figsize=(20,8),dpi=80)
#绘制网格
plt.grid(alpha=0.1)
plt.plot(x,y1,label="自己",color="orange",linestyle=":")
plt.plot(x,y2,label="同桌")
#添加图例
plt.legend(prop=my_font)
_xlables = ["{}岁".format(i) for i in range(11,31)]
plt.xticks(list(x),_xlables,fontproperties=my_font)
plt.xlabel("time")
plt.ylabel("count")
plt.show()

在这里插入图片描述

2.绘制散点图

主要变化为scatter()这个函数

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STSONG.TTF")
y_3 = [11,17,16,11,12,11,12,6,6,7,5,8,9,12,15,14,17,18,21,16,17,18,21]
y_10 = [10,12,14,15,19,14,15,1,12,14,4,23,24,15,16,48,15,11,17,22]
x = range(0,23)
x2 = range(50,70)
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(x,y_3)
plt.scatter(x2,y_10)
#调整x轴的刻度
_x = list(x)+list(x2)
_xlabels = ["3月{}日".format(i) for i in x]
_xlabels += ["10月{}日".format(j) for j in y_10]
plt.xticks(_x[::3],_xlabels[::3],fontproperties=my_font,rotation=45)
#添加描述信息
plt.ylabel("温度",fontproperties=my_font)
plt.xlabel("时间",fontproperties=my_font)
plt.show()

在这里插入图片描述

3.绘制条形图

a = [1, 2, 3, 4, 5]
b = [56.2,50.8,20.5,52.6,33.4]
plt.bar(range(len(a)),b)
plt.show()

在这里插入图片描述

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STSONG.TTF")

a = [1, 2, 3, 4, 5]
b = [56.2,50.8,20.5,52.6,33.4]
plt.barh(range(len(a)),b,height=0.3)
plt.show()

在这里插入图片描述

绘制条形图的小例子

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STSONG.TTF")

a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
y = list(range(len(a)))
#设置图形大小
plt.figure(figsize=(20,8),dpi = 80)
plt.bar(range(len(a)),b_14,width=0.2,label="9月14日")
plt.bar([i + 0.2 for i in y],b_15,width=0.2,label="9月15日")
plt.bar([i+0.4 for i in y],b_16,width=0.2,label="9月16日")

plt.xticks([i + 0.2 for i in y],a,fontproperties=my_font)
#添加图例
plt.legend(prop=my_font)
plt.show()

在这里插入图片描述

<think>我们有两个引用,用户的需求是使用plt.plot设置横纵坐标间隔为1。 引用[1]展示了设置横坐标从1开始,间隔为1的方法: x=np.arange(0,len(list1))+1 # 创建从1开始的横坐标数组 x[0]=1 # 确保第一个元素是1(其实这里np.arange(0,len(list1))是从0到len-1,然后+1就变成1到len,所以x[0]已经是1,这步可以省略) my_x_ticks = np.arange(1, 14, 1) # 创建刻度数组,从1到13,步长为1 plt.xticks(my_x_ticks) # 设置横坐标刻度 plt.plot(x, list1) plt.plot(x, list2) 引用[2]提到了设置坐标间距以及为图中点设置数值,但用户主要关心的是设置坐标间隔为1。 因此,我们可以总结出设置横坐标间隔为1的步骤: 1. 创建横坐标数组,使其值为整数,从1开始(或其他你想要的起始点),步长1,长度与数据相同。 2. 使用plt.xticks()设置横坐标的刻度,刻度的范围从最小值到最大值,步长为1。 同样,纵坐标也可以类似设置,使用plt.yticks()。 但是注意,用户要求的是横纵坐标间隔都为1。因此,我们不仅要设置横坐标,还要设置纵坐标的间隔为1。 然而,纵坐标的数据范围可能不是整数,或者范围较大,强制设置为1的间隔可能不美观。因此,我们需要根据纵坐标的数据范围来设定纵坐标的刻度,使其间隔为1,但前提是纵坐标的数据是整数并且范围合适。 如果纵坐标数据范围很大(比如几千),那么设置间隔为1会导致刻度非常密集,所以通常只有在数据范围较小(比如10~20个整数)时才适合设置间隔为1。 所以,在实际操作中,我们需要: 1. 确定横坐标的范围和步长(例如,从1到数据点个数,步长为1)。 2. 确定纵坐标的范围,然后根据范围设定一个合适的步长(如果范围小,可以设步长为1;如果范围大,则不适合设步长为1)。 用户明确要求间隔为1,所以我们假设用户的数据范围适合。 具体步骤: 横坐标设置: x = np.arange(1, len(data)+1) # 横坐标从1开始,到数据长度,步长1 plt.xticks(np.arange(min(x), max(x)+1, 1)) # 设置横坐标刻度从最小值到最大值,步长为1 纵坐标设置: 我们先获取纵坐标数据的整数范围,然后设置步长为1: y_min = int(np.floor(min(data))) y_max = int(np.ceil(max(data))) plt.yticks(np.arange(y_min, y_max+1, 1)) 但是注意:如果纵坐标数据范围很大,比如1000,那么从0到1000每隔1一个刻度,会有1000个刻度,这是不现实的。因此,我们可能需要判断一下范围,如果范围太大,我们可以提示用户或者只设置横坐标间隔为1,纵坐标则根据情况自动调整或设置一个合适的步长。 由于用户要求横纵坐标间隔都为1,我们按照要求给出代码,但需要提醒用户注意纵坐标范围。 另外,引用[2]还提到为图中点设置数值,这可以通过添加文本标签实现,但用户问题中未要求,所以暂不涉及。 因此,回答如下: </think>使用 `plt.plot` 设置横纵坐标间隔为 1 的方法如下(基于 Matplotlib ): ### 解决方案代码 ```python import matplotlib.pyplot as plt import numpy as np # 示例数据 list1 = [2, 4, 6, 8, 10, 12, 14] list2 = [1, 3, 5, 7, 9, 11, 13] # 创建横坐标数组(从1开始,间隔为1) x = np.arange(1, len(list1) + 1) # 确保横坐标从1开始 # 创建图像 plt.figure(figsize=(10, 6)) # 绘制曲线 plt.plot(x, list1, marker='o', label='Line1') plt.plot(x, list2, marker='s', label='Line2') # 设置坐标轴间隔为1 plt.xticks(np.arange(min(x), max(x)+1, 1)) # 横坐标间隔为1 plt.yticks(np.arange(0, 16, 1)) # 纵坐标间隔为1(根据数据范围调整) # 添加标签和标题 plt.xlabel('X轴(间隔=1)') plt.ylabel('Y轴(间隔=1)') plt.title('坐标轴间隔设置示例') plt.legend() # 显示网格 plt.grid(linestyle='--', alpha=0.7) plt.show() ``` ### 关键设置说明 1. **横坐标间隔设置** ```python plt.xticks(np.arange(min(x), max(x)+1, 1)) ``` - `np.arange(min(x), max(x)+1, 1)` 生成从最小横坐标值到最大值的整数序列(步长=1) - 例如数据长度 7 → 刻度为 [1,2,3,4,5,6,7] 2. **纵坐标间隔设置** ```python plt.yticks(np.arange(0, 16, 1)) ``` - 根据数据范围手动指定纵坐标范围(此处示例设为 0-15) - 实际使用时需按数据范围调整 `np.arange(start, stop, step)` 3. **注意事项** - 若数据点密集(>50),间隔=1 会导致刻度重叠,此时建议增大间隔 - 通过 `plt.xlim()`/`plt.ylim()` 可单独调整坐标范围 - 使用 `plt.tight_layout()` 可自动优化坐标轴间距 ### 效果对比 | **未设置间隔** | **设置间隔=1** | |----------------|----------------| | 坐标自动缩放,间隔非整数 | 精确控制刻度为整数步长 | | 横坐标可能出现小数值 | 横坐标严格按1递增 | | 需手动读取数据点值 | 直接通过网格读取数值[^2] | > ![坐标间隔对比图](https://via.placeholder.com/400x200?text=左:未设置间隔|右:间隔=1) > *左:未设置间隔时出现小数坐标;右:设置间隔=1后的效果[^1][^2]*
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值