我已经生成了一些数据并尝试将它们可视化为同一图中的两个图形。一个作为条形,另一个作为一条线。
但由于某些原因,图表似乎不重叠。
这是我的代码:
# roll two 6-sided dices 500 times
dice_1 = pd.Series(np.random.randint(1, 7, 500))
dice_2 = pd.Series(np.random.randint(1, 7, 500))
dices = dice_1 + dice_2
# plotting the requency of a 2 times 6 sided dice role
fc = collections.Counter(dices)
freq = pd.Series(fc)
freq.plot(kind='line', alpha=0.6, linestyle='-', marker='o')
freq.plot(kind='bar', color='k', alpha=0.6)
这是图表。
数据集是相同的,但是线图将两个数据点向右移动(从4开始而不是2)。如果我单独绘制它们,它们会正确显示(从2开始)。那么如果我在同一个图表中绘制它们会有什么不同呢?以及如何解决这个问题?
答案 0 :(得分:1)
我还没有找到一种比重新提供x轴数据更简单的方法。如果这代表了您正在使用的更大的方法,那么您可能需要从pd.Series()
而不是使用列表来绘制此数据,但此代码至少会为您提供所需的绘图。如果您正在使用Python 3,请将iteritems()
更改为items()
。
似乎x轴的某些自动缩放发生在线图之后,这使得两个图不同步两个点(可能的最低值)。有可能在x轴上禁用此自动缩放,直到两个绘图都出现,但这似乎更难。
import collections
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# roll two 6-sided dices 500 times
dice_1 = pd.Series(np.random.randint(1, 7, 500))
dice_2 = pd.Series(np.random.randint(1, 7, 500))
dices = dice_1 + dice_2
# plotting the requency of a 2 times 6 sided dice role
fc = collections.Counter(dices)
x_axis = [key for key, value in fc.iteritems()]
y_axis = [value for key, value in fc.iteritems()]
plt.plot(x_axis, y_axis, alpha=0.6, linestyle='-', marker='o')
plt.bar(x_axis, y_axis, color='k', alpha=0.6, align='center')
plt.show()
答案 1 :(得分:1)
这是因为系列图使用索引,将use_index
设置为False
将解决问题,我还建议使用groupby
和len
计算每个频率组合
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# roll two 6-sided dices 500 times
dice_1 = pd.Series(np.random.randint(1, 7, 500))
dice_2 = pd.Series(np.random.randint(1, 7, 500))
dices = dice_1 + dice_2
# returns the corresponding value of each index from dices
func = lambda x: dices.loc[x]
fc = dices.groupby(func).agg({'count': len})
ax = fc.plot(kind='line', alpha=0.6, linestyle='-',
marker='o', use_index=False)
fc.plot(ax=ax, kind='bar', alpha=0.6, color='k')
plt.show()