Home  >  Article  >  Backend Development  >  Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit

Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit

Python当打之年
Python当打之年forward
2023-08-10 16:00:111281browse


##Is matplotlib cumbersome? Confused about setting drawing properties? Are you forced to read long and boring API documents because you often can't remember a certain layer setting function? Or are you writing a lot of loop code to set properties when facing multiple matplotlib subplots? Finally, do you still hope that you can master all two-dimensional, spatial and other types of chart drawing methods by just proficient in one Python drawing package? ? In addition, there are a lot of frustrations and complaints. I wonder if you are like this? Anyway, the points listed above are my biggest feelings when using matplotlib to customize charts. Of course, this tweet is not to complain, but to provide you with good solutions. Let's introduce today's protagonist--ProPlot. honestly! When I first discovered this package:
"Huh? Yes, the logo is very similar to matplotlib" However, when I became familiar with most matplotlib drawings and often used it, when I came back and looked at this tool package: "My ri, it smells so good!! What did I do before? Use it quickly!" . In short, if the previous tweet was revised multiple times by SCI because of the pictures! ? Because you haven’t discovered that this Python scientific drawing treasure toolkit allows you to set up sci publication-level figure formats in one step, then this tweet will tell you how to use less code to achieve tedious custom drawing requirements. Of course, It is also a picture that meets the needs of publishing. The main content is as follows:
  • ProPlot library introduction
  • ProPlot example demonstration

ProPlot library introduction

When using Python-matplotlib to draw charts, the default color and format themes can only help us become familiar with the drawing functions. If you want to design excellent visualization works (whether it is publication level or slightly artistic), you need to be familiar with a large number of drawing functions, such as

colors, scales, spines, fonts, etc. When it comes to drawingMultiple subplots, these operations will consume a lot of our energy, will inevitably lead to lengthy code writing, and are also error-prone. For details, you can check out my previous article Python-matplotlib Academic Scatter Chart EE Statistics and Drawing and Python-matplotlib horizontally stacked column chart drawing. In addition, if you need to use matplotlib for drawing every day and often need to beautify the charts, then the Proplot drawing package is perfect for you, and don’t worry about not getting used to it. People have highly praised matplotlib. Encapsulation, greatly simplifying the drawing function. Below we will briefly introduce its installation and main usage methods. If you want to know more about it, you can go to the official website.

Installation

We can install directly using pip or conda That’s it,

#for pip
pip install proplot
#for conda
conda install -c conda-forge proplot

Of course, due to the continuous update of the version, you can also use the following code for update processing:

#for pip
pip install --upgrade proplot
#for conda
conda upgrade proplot

format() simplified code

Proplot drawing charts does not require setting each drawing property like matplotlib does. The format() function provided provides the format of changing all settings at once. ization method. Let’s first give a simple example, as follows:

  • Use matplotlib to draw
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import matplotlib as mpl
with mpl.rc_context(rc={'axes.linewidth': 1, 'axes.color': 'gray'}):
    fig, axs = plt.subplots(ncols=2, sharey=True)
    axs[0].set_ylabel('bar', color='gray')
    for ax in axs:
        ax.set_xlim(0, 100)
        ax.xaxis.set_major_locator(mticker.MultipleLocator(10))
        ax.tick_params(width=1, color='gray', labelcolor='gray')
        ax.tick_params(axis='x', which='minor', bottom=True)
        ax.set_xlabel('foo', color='gray')
  • ProPlot drawing
import proplot as plot
fig, axs = plot.subplots(ncols=2)
axs.format(linewidth=1, color='gray')
axs.format(xlim=(0, 100), xticks=10, xtickminor=True, xlabel='foo', ylabel='bar')

You can see the simplicity of Proplot from this simple example.

A-b-c Add multiple sub-picture serial numbers

In addition to the aboveformat() greatly reduce the code In terms of quantity, we have introduced a drawing method that I think is more convenient -The serial number of multiple subgraphs is automatically added. Specific examples are as follows:

# 样本数据
import numpy as np
state = np.random.RandomState(51423)
data = 2 * (state.rand(100, 5) - 0.5).cumsum(axis=0)

import proplot as plot
fig, axs = plot.subplots(ncols=2)
axs[0].plot(data, lw=2)
axs[0].format(xticks=20, xtickminor=False)
axs.format(abc=True,abcstyle='(A)',abcsize=12,abcloc='ul',
    suptitle='Abc label test', title='Title',
    xlabel='x axis', ylabel='y axis'
)
plt.savefig(r'E:\Data_resourses\DataCharm 公众号\Python\学术图表绘制\ProPlot\abc_01.png',
             dpi=900)

The effect is as follows: Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit

You can also perform style (abcstyle), position (abcloc), size ( abcsize) and other settings. For other detailed settings, please refer to the official website.

Colorbars and legends

  • ##axis Colorbars and Legend
  • import proplot as plot
    import numpy as np
    fig, axs = plot.subplots(nrows=2, share=0, axwidth='55mm', panelpad='1em')
    axs.format(suptitle='Stacked colorbars demo')
    state = np.random.RandomState(51423)
    N = 10
    # Repeat for both axes
    for j, ax in enumerate(axs):
        ax.format(
            xlabel='data', xlocator=np.linspace(0, 0.8, 5),
            title=f'Subplot #{j+1}'
        )
        for i, (x0, y0, x1, y1, cmap, scale) in enumerate((
            (0, 0.5, 1, 1, 'grays', 0.5),
            (0, 0, 0.5, 0.5, 'reds', 1),
            (0.5, 0, 1, 0.5, 'blues', 2)
        )):
            if j == 1 and i == 0:
                continue
            data = state.rand(N, N) * scale
            x, y = np.linspace(x0, x1, N + 1), np.linspace(y0, y1, N + 1)
            m = ax.pcolormesh(
                x, y, data, cmap=cmap,
                levels=np.linspace(0, scale, 11)
            )
            ax.colorbar(m, loc='l', label=f'dataset #{i+1}')
            
    plt.savefig(r'E:\Data_resourses\DataCharm 公众号\Python\学术图表绘制\ProPlot\colorbar_legend_02.png',
                 dpi=900)

The effect is as follows:Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit

  • Figure 颜色条和图例
import proplot as plot
import numpy as np
fig, axs = plot.subplots(ncols=3, nrows=3, axwidth=1.4)
state = np.random.RandomState(51423)
m = axs.pcolormesh(
    state.rand(20, 20), cmap='grays',
    levels=np.linspace(0, 1, 11), extend='both'
)[0]
axs.format(
    suptitle='Figure colorbars and legends demo', abc=True,
    abcloc='l', abcstyle='(a)', xlabel='xlabel', ylabel='ylabel'
)
fig.colorbar(m, label='column 1', ticks=0.5, loc='b', col=1)
fig.colorbar(m, label='columns 2-3', ticks=0.2, loc='b', cols=(2, 3))
fig.colorbar(m, label='stacked colorbar', ticks=0.1, loc='b', minorticks=0.05)
fig.colorbar(m, label=&#39;colorbar with length <1&#39;, ticks=0.1, loc=&#39;r&#39;, length=0.7)

效果如下:Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit

时间刻度(Datetime ticks)

  • Datetime ticks
import proplot as plot
import numpy as np
plot.rc.update(
    linewidth=1.2, fontsize=10, ticklenratio=0.7,
    figurefacecolor=&#39;w&#39;, facecolor=&#39;pastel blue&#39;,
    titleloc=&#39;upper center&#39;, titleborder=False,
)
fig, axs = plot.subplots(nrows=5, axwidth=6, aspect=(8, 1), share=0)
axs[:4].format(xrotation=0)  # no rotation for these examples

# Default date locator
# This is enabled if you plot datetime data or set datetime limits
axs[0].format(
    xlim=(np.datetime64(&#39;2000-01-01&#39;), np.datetime64(&#39;2001-01-02&#39;)),
    title=&#39;Auto date locator and formatter&#39;
)

# Concise date formatter introduced in matplotlib 3.1
axs[1].format(
    xlim=(np.datetime64(&#39;2000-01-01&#39;), np.datetime64(&#39;2001-01-01&#39;)),
    xformatter=&#39;concise&#39;, title=&#39;Concise date formatter&#39;,
)

# Minor ticks every year, major every 10 years
axs[2].format(
    xlim=(np.datetime64(&#39;2000-01-01&#39;), np.datetime64(&#39;2050-01-01&#39;)),
    xlocator=(&#39;year&#39;, 10), xformatter=&#39;\&#39;%y&#39;, title=&#39;Ticks every N units&#39;,
)

# Minor ticks every 10 minutes, major every 2 minutes
axs[3].format(
    xlim=(np.datetime64(&#39;2000-01-01T00:00:00&#39;), np.datetime64(&#39;2000-01-01T12:00:00&#39;)),
    xlocator=(&#39;hour&#39;, range(0, 24, 2)), xminorlocator=(&#39;minute&#39;, range(0, 60, 10)),
    xformatter=&#39;T%H:%M:%S&#39;, title=&#39;Ticks at specific intervals&#39;,
)

# Month and year labels, with default tick label rotation
axs[4].format(
    xlim=(np.datetime64(&#39;2000-01-01&#39;), np.datetime64(&#39;2008-01-01&#39;)),
    xlocator=&#39;year&#39;, xminorlocator=&#39;month&#39;,  # minor ticks every month
    xformatter=&#39;%b %Y&#39;, title=&#39;Ticks with default rotation&#39;,
)
axs.format(
    ylocator=&#39;null&#39;, suptitle=&#39;Datetime locators and formatters demo&#39;
)
plot.rc.reset()
plt.savefig(r&#39;E:\Data_resourses\DataCharm 公众号\Python\学术图表绘制\ProPlot\datetick.png&#39;,
             dpi=900)

效果如下:Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit

以上是我认为ProPlot 比较优秀的几点,当然,大家也可以自行探索,发现自己喜欢的技巧。

ProPlot 实例演示

我们使用之前的推文数据进行实例操作,详细代码如下:

#开始绘图
labels = [&#39;L1&#39;, &#39;L2&#39;, &#39;L3&#39;, &#39;L4&#39;, &#39;L5&#39;]
data_a = [20, 34, 30, 35, 27]
data_b = [25, 32, 34, 20, 25]
data_c = [12, 20, 24, 17, 16]

x = np.arange(len(labels))
width = .25
fig, axs = plot.subplots(ncols=2, nrows=1, sharey=1, width=10,height=4)
#for mark, data in zip()
axs[0].plot(x,y1, marker=&#39;s&#39;,c=&#39;k&#39;,lw=.5,label=&#39;D1&#39;,markersize=8)
axs[0].plot(x,y2, marker=&#39;s&#39;,c=&#39;k&#39;,ls=&#39;--&#39;,lw=.5,markersize=8,markerfacecolor=&#39;white&#39;,markeredgewidth=.4,label=&#39;D2&#39;)
axs[0].plot(x,y3,marker=&#39;^&#39;,c=&#39;k&#39;,lw=.5,markersize=8,markerfacecolor=&#39;dimgray&#39;,markeredgecolor=&#39;dimgray&#39;,
                     label=&#39;D3&#39;)
axs[0].plot(x,y4,marker=&#39;^&#39;,c=&#39;k&#39;,lw=.5,markersize=8,label=&#39;D4&#39;)

axs[1].bar(x-width/2, data_a,width,label=&#39;category_A&#39;,color=&#39;#130074&#39;,ec=&#39;black&#39;,lw=.5)
axs[1].bar(x+width/2, data_b, width,label=&#39;category_B&#39;,color=&#39;#CB181B&#39;,ec=&#39;black&#39;,lw=.5)
axs[1].bar(x+width*3/2, data_c,width,label=&#39;category_C&#39;,color=&#39;#008B45&#39;,ec=&#39;black&#39;,lw=.5)

#先对整体进行设置
axs.format(ylim=(0,40),
    xlabel=&#39;&#39;, ylabel=&#39;Values&#39;,
    abc=True, abcloc=&#39;ur&#39;, abcstyle=&#39;(A)&#39;,abcsize=13,
    suptitle=&#39;ProPlot Exercise&#39;
)
#再对每个子图进行设置
axs[0].format(ylim=(10,40),title=&#39;Multi-category scatter plot&#39;)
axs[1].format(title=&#39;Multi-category bar plot&#39;,xticklabels=[&#39;L1&#39;, &#39;L2&#39;, &#39;L3&#39;, &#39;L4&#39;, &#39;L5&#39;])

plt.savefig(r&#39;E:\Data_resourses\DataCharm 公众号\Python\学术图表绘制\ProPlot\test_01.png&#39;,
            dpi=900)
plt.show()

效果如下:Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit

只是简单的绘制,其他的设置也需要熟悉绘图函数,这里就给大家做个简单的演示。

总结

本期推文我们介绍了matplotlib非常优秀的科学图表绘图库PrpPlot, 在一定程度上极大了缩减了定制化绘制时间,感兴趣的同学可以持续关注这个库,当然,还是最好在熟悉matplotlib基本绘图函数及图层属性设置函数的基础上啊。

The above is the detailed content of Still annoyed by Matplotlib’s cumbersome layer settings! ? Come and take a look at this Python drawing toolkit. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:Python当打之年. If there is any infringement, please contact admin@php.cn delete