如何使用Python绘制能量排名数字?

时间:2017-03-29 13:31:21

标签: python pandas matplotlib ranking

这是一个典型的能源排名,在一些已发表的论文中使用,我正在努力使用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”列以启用了mat_lotlib中的specific_column_values着色,我认为我只是使用简单的plt.scatter。我正在努力的主要是绘制细线而不是典型的标记,以及如何在不同数据之间自动连接类似系统之间的虚线?非常感谢任何帮助或建议。

Energy Ranking Plots

2 个答案:

答案 0 :(得分:2)

我实施了我在评论中建议的一个例子。这不会自动缩放轴(我硬编码),或添加刻度标签,但这些都是你应该能够在其他问题上找到的东西。

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])

答案 1 :(得分:1)

从技术上来说,我不确定这是否是答案,但是我开发了基于tkinter的Python应用程序,用于以简单的方式绘制这些图。

我认为这可能有用,请在以下网址查看:
https://github.com/ricalmang/mechaSVG

用户界面如下所示: Here is how the user interface looks like

以下是典型输出图的样子: Here is how a typical output graph looks like

技术说明:
在引擎盖下,相应的SVG代码的程序生成(逐元素生成)用于图形准备。大部分操作都是通过名为SvgGenEsp的类完成的,在这里不再赘述,因为它太长了(超过300行代码)。