编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

不会扣工资!教你6个用python在工作报表里完成多数据曲线的方法

wxchong 2024-06-27 01:50:29 开源技术 11 ℃ 0 评论

概要:

python的matplotlib作图很强大,本文教你用6种不同方式解决将多种数据曲线画到一起。

问题:

今天,老板又要一个数据报表,小明选择用 python来实现。“用matplotlib用来可视化。并且必须用不同颜色标志每个数据曲线,曲线这些颜色也应该在Python里自动选择。”

"Python大大,你能给我一个方法,在同一个图中为不同的地块添加不同的颜色吗?",小明把这个问题抛给了Python大大。大大低头片刻,然后胸有成足的抬起头,说,“可以,给你6个办法来实现!!”

方式一初级办法:

利用Matplotlib的默认方式来执行此操作。

例如:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

而且,正如您可能已经知道的那样,您可以轻松添加图例:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()

如果要控制将循环的颜色:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()

希望有所帮助!如果您对matplotlib不熟悉。请关注微信python_dada学习。

方式二:

首先,如果你想要在一个图上上绘制很多数据曲线,可以:

1. 将它们放在不同的图上(考虑在一个图上使用一些子图),或

2. 使用颜色以外的其他东西(即标记样式或线条粗细)来区分它们。

否则,你将陷入一个非常混乱的境地!

除此之外,许多人在不同程度上都是色盲,区分众多微妙不同的颜色对于更多的人来说比你可能意识到的要困难。

话虽如此,如果你真的想在一个轴上放20条线,并且有20种相对不同的颜色,这是一种方法:

import matplotlib.pyplot as plt
import numpy as np
num_plots = 20
# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)])
# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
plt.plot(x, i * x + 5 * i)
labels.append(r'$y = %ix + %i
% (i, 5*i)) # I'm basically just demonstrating several different legend options here... plt.legend(labels, ncol=4, loc='upper center', bbox_to_anchor=[0.5, 1.1], columnspacing=1.0, labelspacing=0.0, handletextpad=0.0, handlelength=1.5, fancybox=True, shadow=True) plt.show()

请注意,对于最后一个示例,在较新版本的matplotlib中,set_color_cycle已弃用,因此该行应该plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))只是plt.cm.YOUR_PREFERED_COLOR_MAP根据您的需要进行更改。 -

方法三:

如果您不知道要绘制的绘图的数量,可以在绘制它们直接从绘图中检索数字后更改颜色.lines,使用此解决方案:

一些随机数据

import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
for i in range(1,15):
ax1.plot(np.array([1,5])*i,label=i)

您需要的代码段:

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
j.set_color(colors[i])
ax1.legend(loc=2)

结果如下:

方法四,对方法三的改进:

我想对上一篇文章中给出的最后一个循环答案提供一个小的改进(该帖子是正确的,仍然应该被接受)。标记最后一个示例时所隐含的假设是plt.label(LIST)将标签号X放入LIST与第X 个时间对应的行中plot。我之前遇到过这种方法的问题。根据matplotlibs文档()构建图例和自定义标签的推荐方法是让人有一种温暖的感觉以及您认为他们所做的确切情节:

...

# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
plotHandles.append(x)
labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)
**:

方法五:

图(axes)中的每个plot()figure都有自己的颜色循环 - 如果不为每个绘图强制使用不同的颜色,则所有绘图都共享相同的颜色顺序。

只有当我们伸展 "自动"意味着什么时,才能自动实现每个绘图中的不同颜色。

必须使用不同的颜色识别每个绘图,这些颜色应该由[Matplotlib]自动生成。

但是...... Matplotlib会自动为每条不同的曲线生成不同的颜色

In [10]: import numpy as np
...: import matplotlib.pyplot as plt
In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));
Out[11]:

你能给我一个方法,在同一个图中为不同的地块添加不同的颜色吗?

它是有道理的,因为每个绘图(每个axes在Matplotlib的用语中)都有自己的color_cycle(或者更确切地说,在2018年,它的prop_cycle),每个plot(axes)以相同的顺序重用相同的颜色。

In [12]: fig, axes = plt.subplots(2,3)
In [13]: for ax in axes.flatten():
...: ax.plot((0,1), (0,1))

如果这是原始问题的含义,一种可能性是为每个图明确命名不同的颜色。

如果在循环中生成绘图(通常发生),我们必须有一个额外的循环变量来覆盖Matplotlib 自动选择的颜色。

In [14]: fig, axes = plt.subplots(2,3)
In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'):
...: ax.plot((0,1), (0,1), short_color_name)

方法六:

另一种可能性是实例化循环器对象

from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()
fig, axes = plt.subplots(2,3)
for ax in axes.flat:
ax.plot((0,1), (0,1), **next(actual_cycler))

请注意,type(my_cycler)是cycler.Cycler,但是type(actual_cycler)是itertools.cycle。

小结:

本文以python的matplotlib作图为例,用6种方法解决了同时绘制不同数据曲线的问题。

不仅仅体现了python可视化能力的强大,也对拓宽大家的思路做了一定的尝试。希望大家喜欢。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表