<p>由于<a href="https://stackoverflow.com/users/11969685/shaun-lowis">@ShaunLowis</a>的答案没有包含完整的示例,我想我应该添加一个。就读取<code>.csv</code>文件而言,在这种情况下,最好的方法可能是使用<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html" rel="nofollow noreferrer">^{<cd2>}</a>,正如另一个答案所指出的那样。在本例中,我将文件命名为<code>test.csv</code>,并将其放在运行脚本的同一目录中</p>
<pre class="lang-py prettyprint-override"><code>import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("./test.csv")
names = df['Name'].values
x = np.arange(len(names))
w = 0.3
plt.bar(x-w, df['PreviousWeekProg'].values, width=w, label='PreviousWeekProg')
plt.bar(x, df['CurrentWeekProg'].values, width=w, label='CurrentWeekProg')
plt.bar(x+w, df['ExpectedProg'].values, width=w, label='ExpectedProg')
plt.plot(x, df['Target'].values, lw=2, label='Target')
plt.xticks(x, names)
plt.ylim([0,100])
plt.tight_layout()
plt.xlabel('X label')
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), fancybox=True, ncol=5)
plt.savefig("CSVBarplots.png", bbox_inches="tight")
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/LFSA0.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/LFSA0.png" alt="enter image description here"/></a></p>
<hr/>
<h2>解释</h2>
<p>从<code>pandas</code>文档中,<code>read_csv()</code>(排除了与示例无关的参数)</p>
<blockquote>
<p><code>pandas.read_csv(filepath_or_buffer)</code></p>
<blockquote>
<p>Read a comma-separated values (csv) file into DataFrame.<br/>
<br/>
<strong><code>filepath_or_buffer</code></strong>: <em>str, path object or file-like object</em> </p>
<blockquote>
<p>Any valid string path is acceptable. The string could be a URL. [...] If you want to pass in a path object, pandas accepts any <code>os.PathLike</code>.<br/>
<br/>
By file-like object, we refer to objects with a <code>read()</code> method, such as a file handler (e.g. via builtin <code>open</code> function) or <code>StringIO</code>.</p>
</blockquote>
</blockquote>
</blockquote>
<p>在本例中,我指定的是文件的路径,而不是文件对象。在</p>
^{pr2}$
<p>这将提取<code>'Name'</code>列中的值并将其转换为<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html" rel="nofollow noreferrer">^{<cd7>}</a>对象。为了绘制一个名称的多个条形图,我引用了<a href="https://stackoverflow.com/a/14270596/10659910">this answer</a>。但是,为了使用这个方法,我们需要一个与<code>names</code>数组长度相同的浮点数组,因此</p>
<pre class="lang-py prettyprint-override"><code>x = np.arange(len(names))
</code></pre>
<p>然后设置条的宽度并相应地偏移第一条和第三条,如<a href="https://stackoverflow.com/a/14270596/10659910">referenced answer</a>中的轮廓</p>
<pre class="lang-py prettyprint-override"><code>w = 0.3
plt.bar(x-w, df['PreviousWeekProg'].values, width=w, label='PreviousWeekProg')
plt.bar(x, df['CurrentWeekProg'].values, width=w, label='CurrentWeekProg')
plt.bar(x+w, df['ExpectedProg'].values, width=w, label='ExpectedProg')
</code></pre>
<p>从<a href="https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.bar.html" rel="nofollow noreferrer">^{<cd10>}</a>页(排除未使用的非位置参数)</p>
<blockquote>
<p><code>matplotlib.pyplot.bar(x, height, width=0.8)</code></p>
<blockquote>
<p>The bars are positioned at <code>x</code> [...] their dimensions are given by <code>width</code> and <code>height</code>.<br/>
<br/>
Each of <code>x</code>, <code>height</code>, and <code>width</code> may either be a scalar applying to all bars, or it may be a sequence of length <code>N</code> providing a separate value for each bar.</p>
</blockquote>
</blockquote>
<p>在本例中,<code>x</code>和{<cd12>}是值序列(每个条不同),而<code>width</code>是一个标量(每个条都是相同的)。在</p>
<p>接下来是<code>target</code>的行,它非常简单,只需根据<code>'Target'</code>列中的值绘制前面创建的<code>x</code>值</p>
<pre class="lang-py prettyprint-override"><code>plt.plot(x, df['Target'].values, lw=2, label='Target')
</code></pre>
<p>其中<code>lw</code>指定线宽。<strong>免责声明</strong>:如果<code>.csv</code>的每一行的目标值都不相同,则此操作仍然有效,但可能与您希望的不完全相同。在</p>
<p>接下来的两行</p>
<pre class="lang-py prettyprint-override"><code>plt.xticks(x, names)
plt.ylim([0,100])
</code></pre>
<p>只需在适当的<code>x</code>位置添加这些名称,然后设置<code>y</code>限制来跨越<code>[0, 100]</code>。在</p>
<p>最后一点是在情节下方添加图例</p>
<pre class="lang-py prettyprint-override"><code>plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), fancybox=True)
</code></pre>
<p>请参阅<a href="https://stackoverflow.com/a/4701285/10659910">this answer</a>,了解如何根据需要调整此值。在</p>