GVKun编程网logo

如何防止数字在Python matplotlib图中更改为指数形式(matplotlib改变刻度)

20

本文将分享如何防止数字在Pythonmatplotlib图中更改为指数形式的详细内容,并且还将对matplotlib改变刻度进行详尽解释,此外,我们还将为大家带来关于Cpp调用Python3,使用ma

本文将分享如何防止数字在Python matplotlib图中更改为指数形式的详细内容,并且还将对matplotlib改变刻度进行详尽解释,此外,我们还将为大家带来关于Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)、java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本、matplotlib ( python) - 在点击事件中更改全局变量、Matplotlib python在colormap中更改单色的相关知识,希望对你有所帮助。

本文目录一览:

如何防止数字在Python matplotlib图中更改为指数形式(matplotlib改变刻度)

如何防止数字在Python matplotlib图中更改为指数形式(matplotlib改变刻度)

我在Python中使用Matplotlib绘制简单的xy数据集。这会产生漂亮的图形,尽管当我使用“图形视图”(执行时出现plt.show())在绘图图形的各个部分上“放大”得太近时,x轴值也会从标准数字格式(1050、1060, 1070等)转换成具有指数符号的科学形式(例如x,x轴标记为的1、1.5、2.0 +1.057e3)。

我希望我的图形保留轴的简单编号,而不要使用指数形式。有没有一种方法可以强制Matplotlib执行此操作?

答案1

小编典典

勾号标签的格式由Formatter对象控制ScalerFormatter,默认情况下,假设你未做任何花哨的操作,它将是。如果可见值的分数变化很小,则此格式化程序将使用恒定移位。为了避免这种情况,只需将其关闭:

plt.plot(arange(0,100,10) + 1000, arange(0,100,10))ax = plt.gca()ax.get_xaxis().get_major_formatter().set_useOffset(False)plt.draw()

如果你想避免普遍采用科学计数法,

ax.get_xaxis().get_major_formatter().set_scientific(False)

可以通过axes.formatter.useoffsetrcparam 全局控制。

Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)

Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)

To my knowledge so far, Cpp画图是真滴捉急, 那就调用python帮帮忙吧。

百度了好久,试了好几次,终于走完了配置的过程。我要记录一下。

 

1.0 配置:(操作系统)64位Win7, (Cpp的IDE是)Clion。

 

1.1 安装Clion

  官网下载就可以了,地址 https://www.jetbrains.com/clion/

 

1.2 安装,配置mingW64

  1.2.1:Clion需要我们安装Toolchain,我用的是mingW64(因为我用的是64位系统),附上百度网盘地址。

    地址:https://pan.baidu.com/s/14FkN0Ul9cvcRxCOcylmoxw,密码:qu5l

  1.2.2:然后我一股脑把路径全部添加到环境变量path了

    (

      D:\ProgramFile\mingw64;

      D:\ProgramFile\mingw64\bin;

      D:\ProgramFile\mingw64\lib;

      D:\ProgramFile\mingw64\include

    )  

  1.2.3:让Clion找到mingw64

  

    如果其中的Make, C Complier,C++ Complier没找到,就手动帮Clion添加。

    !!!注意mingw的版本(指的是64位还是32位),一定要和pyhton的匹配。否则会出现如下错误:

      载入Python.h:没问题 ; 读取其中函数:unreferenced...

1.3 安装python

  1.3.1 安装python3.7

    我的安装目录是 D:\ProgramFile\Python37 ,没有用Anaconda,事实上(可能是由于环境变量path中争抢调用关系的问题),我把原来装好的anaconda卸载了。

    安装的版本是官网下载的。

    同时,添加了 D:\ProgramFile\Python37到环境变量path。

  1.3.2 用pip安装matplotlib

    a. python3.7中的pip是自带的

    b. 将python安装目录下的scripts添加到环境变量bin

    c. (可选)查看python是否安装成功:在cmd界面,输入:python --version

    d. (可选)查看pip是否安装成功:在cmd界面,输入:pip --version

    e. (可选)升级pip:在cmd界面,输入:python -m pip install -U pip setuptools

    f.  用pip安装matplotlib:在cmd界面,输入:python -m pip install matplotlib

 

1.4 Clion联结Cpp和python

  1.4.1:CMakeLists.txt的配置:

    用clion新建cpp的project,在CMakeLists.txt中添加以下两句话

    # 添加python.h头文件路径
    
include_directories(D:/ProgramFile/Python37/include)
    # 添加python动态链接库文件
    link_libraries(D:/ProgramFile/Python37/libs/python37.lib)

    如下图:

  1.4.2:main.cpp的配置

    我直接上图吧,如果这个cpp可以运行,那么说明配置成功了。

    

  

 

java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本

java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本

写在前面,最近需要在java中调用matplotlib,其他一些画图包都没这个好,毕竟python在科学计算有优势。找到了matplotlib4j,大概看了下github上的https://github.com/sh0nk/matplotlib4j,maven repository:

<dependency>
   <groupId>com.github.sh0nk</groupId>
       <artifactId>matplotlib4j</artifactId>
       <version>0.5.0</version>
</dependency>

简单贴个测试类,更多的用法在test报下有个MainTest.class。

 @Test
    public void testPlot() throws IOException, PythonExecutionException, ClassNotFoundException, NoSuchMethodException, illegalaccessexception, InvocationTargetException, InstantiationException {
        Plot plot = Plot.create(PythonConfig.pythonBinPathConfig("D:\\python3.6\\python.exe"));
        plt.plot()
                .add(Arrays.asList(1.3, 2))
                .label("label")
                .linestyle("--");
        plt.xlabel("xlabel");
        plt.ylabel("ylabel");
        plt.text(0.5, 0.2, "text");
        plt.title("Title!");
        plt.legend();
        plt.show();

    }

下面问题来了,这个对matplotlib的封装不是很全面,源码里也有很多todo,有很多函数简单用用还行,很多重载用不了,比如plt.plot(xdata,ydata)可以,但是无法在其中指定字体plt.plot(xdata,ydata,fontsize=30);

所以想要更全面的用法还得自己动手,几种办法:

  1. 大部分还是用matplotlib4j中的,个别的自己需要的但里头没有的函数,实现他的builder接口,重写build方法,返回一个py文件中命令行的字符串形式,然后反射取到PlotImpl中的成员变量registeredBuilders,往后追加命令行,感觉适用于只有极个别命令找不到的情况,挺麻烦的,而且要是传nd.array(…)这种参数还得额外拼字符串。
//拿到plotImpl中用于组装python脚本语句的的registeredBuilders,需要加什么直接添加新的builder就行了
        Field registeredBuildersField = plt.getClass().getDeclaredField("registeredBuilders");
        registeredBuildersField.setAccessible(true);
        List<Builder> registeredBuilders = (List<Builder>) registeredBuildersField.get(plt);

        TicksBuilder ticksBuilder = new TicksBuilder(yList, "yticks", fontSize);
        registeredBuilders.add(ticksBuilder);
  1. 这种比较直接,参照matplotlib4j底层,直接写py.exe文件,执行命令行,比较推荐这种,一行一行脚本自己写,数据拼装方便,看起来直观。比如写如下的脚本并执行,搞两组数据,画个散点图
import numpy as np
import matplotlib.pyplot as plt
plt.plot(np.array(自己的x数据), np.array(自己的y数据), 'k.', markersize=4)
plt.xlim(0,6000)
plt.ylim(0,24)
plt.yticks(np.arange(0, 25, 1), fontsize=10)
plt.title("waterfall")
plt.show()

像下面这么写就行了

		//1. 准备自己的数据 不用管
        List<Float> y_secondList_formatByHours = y_secondList.stream().map(second -> (float)second / 3600).collect(Collectors.toList());

        //2.准备命令行list,逐行命令添加
        List<String> scriptLines = new ArrayList<>();
        scriptLines.add("import numpy as np");
        scriptLines.add("import matplotlib.pyplot as plt");
        scriptLines.add("plt.plot("+"np.array("+x_positionList+"),"+"np.array(" +y_secondList_formatByHours+"),\"k.\",label=\"waterfall\",lw=1.0,markersize=4)");
        scriptLines.add("plt.xlim(0,6000)");
        scriptLines.add("plt.ylim(0,24)");
        scriptLines.add("plt.yticks(np.arange(0, 25, 1), fontsize=10)");
        scriptLines.add("plt.title(\"waterfall\")");
        scriptLines.add("plt.show()");
        //3. 调用matplotlib4j 里面的pycommond对象,传入自己电脑的python路径
        pycommand command = new pycommand(PythonConfig.pythonBinPathConfig("D:\\python3.6\\python.exe"));
        //4. 执行,每次执行会生成临时文件 如C:\Users\ADMINI~1\AppData\Local\Temp\1623292234356-0\exec.py,这个带的日志输出能看到,搞定
        command.execute(Joiner.on('\n').join(scriptLines));

在这里插入图片描述

搞定。

matplotlib ( python) - 在点击事件中更改全局变量

matplotlib ( python) - 在点击事件中更改全局变量

如何解决matplotlib ( python) - 在点击事件中更改全局变量?

matplotlib - 在点击事件中更改全局变量。

嘿,我花了太多时间来解决这个问题,现在什么都没有。 我试过这个代码:

def menu_event(event):
    global state
    state +=1
    print(state)

def main():
    ...
    b = Button(button_ax,name,color=color,hovercolor=font_color)
    b.on_clicked(menu_event)
    ...
    while True:
        print(state)
    

state = 0
if __name__ == "__main__":
    main()

并且状态变量不会改变! 我在输出中得到的内容如下:

0
0
0
1 # A push of a button happened
0
0
0
2 # A push of a button happened
0
0
0
3 # A push of a button happened
0
0

...

因此它使“状态”像 menu_event(event) 的静态变量一样。 我怎么了?感谢您的帮助!

解决方法

Matplotlib 的文档有一个 nice example code 用于以交互方式定义/使用按钮。

出于好奇,我更改了示例,将 indnextprev 作为全局变量和函数:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

freqs = np.arange(2,20,3)

fig,ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)
t = np.arange(0.0,1.0,0.001)
s = np.sin(2*np.pi*freqs[0]*t)
l,= plt.plot(t,s,lw=2)

def next(event):
    global ind
    ind += 1
    i = ind % len(freqs)
    ydata = np.sin(2*np.pi*freqs[i]*t)
    l.set_ydata(ydata)
    plt.draw()

def prev(event):
    global ind
    ind -= 1
    i = ind % len(freqs)
    ydata = np.sin(2*np.pi*freqs[i]*t)
    l.set_ydata(ydata)
    plt.draw()


ind = 0

def main():
    axprev = plt.axes([0.7,0.05,0.1,0.075])
    axnext = plt.axes([0.81,0.075])
    bnext = Button(axnext,''Next'')
    bnext.on_clicked(next)
    bprev = Button(axprev,''Previous'')
    bprev.on_clicked(prev)
    plt.show()

if __name__ == "__main__":
    main()

它像原始代码一样工作。

因此,使用全局变量是一种选择,但将 state 变量与在单个类中修改它的函数一起定义是您应该考虑的更好方法。

例如:


class State(object):

    def __init__(self):
        self._state = 0
        ...

    def click_event(self,event):
        self._state += 1
        ...
        plt.draw()

state = State()
b = Button(button_ax,name,color=color,hovercolor=font_color)
b.on_clicked(state.click_event)

Matplotlib python在colormap中更改单色

Matplotlib python在colormap中更改单色

我在python中使用颜色图来绘制和分析矩阵中的值。我需要将白色与等于0.0的每个元素相关联,而对于其他元素,我希望具有“传统”颜色图。查看 PythonMatplotlib Colormap,我将pcolor使用的字典修改为:

dic = {''red'': ((0., 1, 1),                (0.00000000001, 0, 0),                (0.66, 1, 1),                (0.89,1, 1),                (1, 0.5, 0.5)),        ''green'': ((0., 1, 1),                 (0.00000000001, 0, 0),                 (0.375,1, 1),                 (0.64,1, 1),                 (0.91,0,0),                 (1, 0, 0)),        ''blue'': ((0., 1, 1),                (0.00000000001, 1, 1),                (0.34, 1, 1),                (0.65,0, 0),                (1, 0, 0))}

结果是:在此处输入图片说明

我设置:

matrix[0][0]=0 matrix[0][1]=0.002

但是正如您所看到的,即使我将0.00000000001设置为蓝色的起点,它们也都与白色相关联。这怎么可能?如何更改它以获得我想要的东西?

答案1

小编典典

尽管不理想,但屏蔽零值仍然有效。您可以使用来控制它的显示cmap.set_bad()

from matplotlib.colors import LinearSegmentedColormapimport matplotlib.pyplot as pltimport numpy as npdic = {''red'': ((0., 1, 0),                (0.66, 1, 1),                (0.89,1, 1),                (1, 0.5, 0.5)),        ''green'': ((0., 1, 0),                 (0.375,1, 1),                 (0.64,1, 1),                 (0.91,0,0),                 (1, 0, 0)),        ''blue'': ((0., 1, 1),                (0.34, 1, 1),                (0.65,0, 0),                (1, 0, 0))}a = np.random.rand(10,10)a[0,:2] = 0a[0,2:4] = 0.0001fig, ax = plt.subplots(1,1, figsize=(6,6))cmap = LinearSegmentedColormap(''custom_cmap'', dic)cmap.set_bad(''white'')ax.imshow(np.ma.masked_values(a, 0), interpolation=''none'', cmap=cmap)

在此处输入图片说明

我们今天的关于如何防止数字在Python matplotlib图中更改为指数形式matplotlib改变刻度的分享已经告一段落,感谢您的关注,如果您想了解更多关于Cpp调用Python3,使用matplotlib画(二维)图----1.配置(Clion,mingW64, python, matplotlib)、java版matplotlib,matplotlib4j使用,java中调用matplotlib或者其他python脚本、matplotlib ( python) - 在点击事件中更改全局变量、Matplotlib python在colormap中更改单色的相关信息,请在本站查询。

本文标签: