【问题标题】:How do I plot an energy ranking figure using Python?如何使用 Python 绘制能源排名图?
【发布时间】:2017-03-29 13:31:21
【问题描述】:

这是一个典型的能量排名,在一些已发表的论文中使用,我正在努力使用 Python(任何 matplotlib、sns 等)为我的数据重现一个。我在 Pandas 数据框中构建了我的数据,如下所示:

System  Color_id  Data1  Data2
Form I     1      0.0    0.6
Form II    2      0.8    0.0
Form III   3      2.1    2.7
Form IV    4      2.2    0.3
Form V     5      1.7    1.2

我添加了“Color_id”列来启用在 matplotlib 中的 specific_column_values 着色,我想我只是使用 plt.scatter 的一半。我最挣扎的是绘制细长线而不是典型标记,以及如何在不同数据的相似系统之间自动连接这些虚线?非常感谢任何帮助或建议。

【问题讨论】:

  • 标记被渲染为 unicode 字符,因此有相当多的选择,但它们不能轻易修改。在连接虚线连接的位置之间给出宽度无论如何都需要两个点,所以我建议创建一个辅助函数,分别为实线和虚线生成线条艺术家

标签: python pandas matplotlib ranking


【解决方案1】:

我实现了我在 cmets 中建议的示例。这不会自动缩放轴(我对其进行了硬编码)或添加刻度标签,但这些都是您应该能够在其他问题上找到的所有内容。

import matplotlib.pyplot as plt
import numpy as np

def energy_rank(data, marker_width=.5, color='blue'):
    y_data = np.repeat(data, 2)
    x_data = np.empty_like(y_data)
    x_data[0::2] = np.arange(1, len(data)+1) - (marker_width/2)
    x_data[1::2] = np.arange(1, len(data)+1) + (marker_width/2)
    lines = []
    lines.append(plt.Line2D(x_data, y_data, lw=1, linestyle='dashed', color=color))
    for x in range(0,len(data)*2, 2):
        lines.append(plt.Line2D(x_data[x:x+2], y_data[x:x+2], lw=2, linestyle='solid', color=color))
    return lines

data = np.random.rand(4,8) * 4 # 4 lines with 8 datapoints from 0 - 4

artists = []
for row, color in zip(data, ('red','blue','green','magenta')):
    artists.extend(energy_rank(row, color=color))

fig, ax = plt.subplots()

for artist in artists:
    ax.add_artist(artist)
ax.set_ybound([0,4])
ax.set_xbound([.5,8.5])

【讨论】:

  • 感谢大家的投入。 @Aaron:你的实现太棒了。非常感谢。
【解决方案2】:

我不确定这在技术上是不是这个问题的答案,但我开发了一个基于 tkinter 的 Python 应用程序,用于以简单的方式绘制这些图表。

我认为它可能有用,请查看:
https://github.com/ricalmang/mechaSVG

用户界面如下所示:

典型的输出图如下所示:

技术说明:
在底层,相应 SVG 代码的过程生成(逐个元素生成)用于图形准备。其中大部分是通过一个名为 SvgGenEsp 的类完成的,因为它太长(超过 300 行代码),所以在此不再详述。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 我很欣赏这些建议并相应地编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 2019-12-14
  • 2020-09-14
  • 2023-01-03
  • 2020-01-27
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多